TypeScript中constructor的new() => TView语法及代码解析求助
嘿,我来帮你把这段TypeScript代码里的困惑点拆解清楚,尤其是你提到的new() => TView和const model = new this.template()部分!
1. 搞懂
new() => TView:这是构造函数类型 在TypeScript里,new() => TView是一种构造函数类型注解,它用来描述一个「可以通过new关键字调用、并且返回TView类型实例」的函数——说白了,就是某个类的构造函数。
举个具体的例子:如果你的泛型参数TView是UserViewModel(一个自定义类),那new() => UserViewModel就表示「一个无参数的构造函数,调用new它就能得到UserViewModel的实例」。
这段代码里用这个类型,是因为Presenter是抽象类,它本身不知道要创建哪种具体的TView实例,所以需要子类在构造时传入对应TView类的构造函数,让Presenter能动态创建实例,同时保证类型安全。
2. 理解
const model = new this.template() 这里的this.template就是你在构造函数里传入的那个类的构造函数(类型符合new() => TView)。用new关键字调用它,就和你平时写new UserViewModel()一样,会生成一个TView类型的全新实例。
比如,假设你这样使用Presenter:
// 定义一个具体的ViewModel类 class TodoViewModel { title = ""; completed = false; } // 继承Presenter,传入TodoViewModel的构造函数 class TodoPresenter extends Presenter<TodoViewModel> { constructor() { super(TodoViewModel); // 这里把TodoViewModel类本身传进去,它就是符合`new() => TodoViewModel`的构造函数 } } const presenter = new TodoPresenter(); presenter.reset(); // 执行reset时,this.template就是TodoViewModel,new this.template()就等于new TodoViewModel()
3. 结合reset方法看整体逻辑
reset方法的作用是重置viewModel:
- 如果当前
viewModel是null或undefined,直接把新创建的model赋值给它; - 如果
viewModel已经存在,就用Object.assign把新model的默认属性合并到现有viewModel上,相当于把所有属性重置为初始值。
这样设计的好处是,Presenter可以复用「重置ViewModel」的逻辑,不管你传入的是哪种TView类型,都能正确执行重置操作。
内容的提问来源于stack exchange,提问作者David Mason
相关产品推荐
相关产品推荐

