我有一个带有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
的super()
值,因此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.params
是ExtendedParams
类型,和
super()
调用,而this.params
不是之后覆盖?我有一个带有BaseParams构造函数参数的基类,并希望从Base扩展一个Derived类,该类采用ExtendedParams构造函数参数,并将其与某些...]一起传递给super(),] ...
从Derived
进行BUT,您访问Base.props
,其明确键入为BaseParams
。
如果想要params
属性更改派生类中的类型,则需要一个通用基类型: