我有一个带有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
}
}
类中,Derived
是this.params
类型的,和默认值传递给了ExtendedParams
通话和super()
之后不会被覆盖吗?
答案 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