You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 21:42:44