网站搜索

javascript - 在 TypeScript 中清理类构造函数的一种方法?


目前我正在以以下方式定义我的类构造函数

class MyClass {

  routerStore: RouterStore
  characterStore: CharacterStore
  characterPrivateStore: CharacterPrivateStore

  constructor(
    routerStore: RouterStore,
    characterStore: CharacterStore,
    characterPrivateStore: CharacterPrivateStore
  ) {
    super()
    this.routerStore = routerStore
    this.characterStore = characterStore
    this.characterPrivateStore = characterPrivateStore
  }
}

我觉得这有些冗长和重复。鉴于 TypeScript 利用了一些最新的 JavaScript 提案,我想问是否有可能以某种方式简化它?

答案#1

你可以为构造函数参数添加访问修饰符。这将使该参数也成为类的字段,并使用该参数的值进行初始化。

class MyClass {


   constructor(
       public routerStore: RouterStore,
       public characterStore: CharacterStore,
       public characterPrivateStore: CharacterPrivateStore
    ) {
       super()
   }
}

你也可以使用 Object.assign 在类上声明字段,并使用映射类型仅提取字段键(排除方法):

type JustFieldKeys<T> = { [P in keyof T] : T[P] extends Function ? never : P }[keyof T] 
class MyClass {

    public routerStore!: RouterStore,
    public characterStore!: CharacterStore,
    public characterPrivateStore!: CharacterPrivateStore
    constructor(params: Pick<MyClass, JustFieldKeys<MyClass>>) {
        Object.assign(this, params);
    }
}
new MyClass({
    characterPrivateStore: null,
    characterStore: null,
    routerStore: null
})