派生类中扩展构造函数参数的正确TypeScript类型

时间:2020-04-08 00:56:10

标签: typescript derived-class

我有一个带有Base构造函数参数的BaseParams类,并且想从Derived扩展一个Base类,它需要一个ExtendedParams构造函数参数,并将其连同一些默认值一起传递给super()。问题是我似乎找不到Derived构造函数参数的访问修饰符和类型的正确组合。

这是我到目前为止所拥有的:

interface BaseParams {
  first: string;
}

interface ExtendedParams extends BaseParams {
  last?: string;
}

class Base {
  constructor(protected params: BaseParams) {}
  inspect(): void {
    console.log(this.params);
  }
}

class Derived extends Base {
  constructor(??? params ???) {
    super({ first: 'John', last: 'default', ...params });  // override default params with specified ones
    this.params.last;  // #1 - this should not generate any compile errors
    this.params.whatever = 'Wrong';  // #2 - TS should flag this as not existing on type ExtendedParams
  }
}

const d = new Derived({ first: 'Mike' });
d.inspect();  // #3 - should output { first: 'Mike', last: 'default', whatever: 'Wrong' }

我尝试将Derived params声明为protected。可以解决#1和#2。

class Derived extends Base {
  constructor(protected params: ExtendedParams) {
    super({ first: 'John', last: 'default', ...params });
    this.params.last;  // #1 - ok, no error
    this.params.whatever = 'Wrong';  // #2 - ok, flagged: `whatever` doesn't exist on type ExtendedParams
  }
}

问题在于last: 'default'分配没有发生,因为protected生成了一个this.params = params分配,该分配覆盖了传递给params的{​​{1}}值,因此super()仅输出d.inspect()

我尝试省略{ first: 'Mike', whatever: 'Wrong' }的访问修饰符。这样会导致正确的输出params,但也会导致{ first: 'Mike', last: 'default', whatever: 'Wrong' }被标记为错误this.params.last

does not exist on type 'BaseParams'

是否有一些TypeScript魔术来通知编译器,在class Derived extends Base { constructor(params: ExtendedParams) { super({ first: 'John', last: 'default', ...params }); this.params.last; // #1 - wrong ly flagged this.params.whatever = 'Wrong'; // #2 - ok, flagged } } 类中,Derivedthis.params类型的,默认值传递给了ExtendedParams通话和super()之后不会被覆盖吗?

1 个答案:

答案 0 :(得分:1)

但是从REPLACE ALL OCCURRENCES OF REGEX '^\.[0]\d{0,3}' IN lv_rate WITH space. 您可以访问SHIFT lv_rate RIGHT DELETING TRAILING '0',它的类型显然是Derived

如果您希望Base.params属性更改派生类中的类型,则需要通用基类型:

BaseParams