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

问题描述 投票:0回答:1

我有一个带有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分配,该分配会覆盖传递给paramssuper()值,因此d.inspect()仅输出{ first: 'Mike', whatever: 'Wrong' }。] >

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

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
  }
}

是否有某种TypeScript魔术来通知编译器,在Derived类中,this.paramsExtendedParams类型,

默认值传递给super()调用,而this.params不是之后覆盖?

我有一个带有BaseParams构造函数参数的基类,并希望从Base扩展一个Derived类,该类采用ExtendedParams构造函数参数,并将其与某些...]一起传递给super(),] ...

typescript derived-class
1个回答
0
投票

Derived进行BUT,您访问Base.props,其明确键入为BaseParams

如果想要params属性更改派生类中的类型,则需要一个通用基类型:

© www.soinside.com 2019 - 2024. All rights reserved.