【发布时间】:2021-05-30 03:50:31
【问题描述】:
我有一个带有一些属性/方法的类,这些属性/方法返回最初通过构造函数传递的值:
class Base {
constructor(arg) {
this.options = arg.options;
}
}
人们建议使用泛型作为打字稿等价物的此类:
class Base<T extends {options: any}> {
options: T["options"];
constructor(arg: T) {
this.options = arg.options;
}
}
// works fine with instantiation
const inst = new Base({options: {foo: 123}});
inst.options.foo++; // ok
inst.options.bar; // TS Error
现在我有一个子类,它调用超类的构造函数并传递这些选项:
class Sub extends Base { // TS Error
constructor() {
super({options: {foo: 123}});
this.options.foo++; // TS Error
}
}
Typescript 编译器对此并不满意,并希望通过该类型扩展基类。但后来我有两次信息,在超级调用和扩展符号中。解决我的问题的正确 ts 语法是什么?
(typescript playground 中的代码)
【问题讨论】:
-
您的游乐场链接被切断,因此代码被切断。它只是问题中的代码吗?如果是这样,我已经解决了。如果没有,请将代码同时添加到操场和问题中。 :-)
-
你传递的值
super真的是编译时文字吗? -
FWIW,我怀疑你可以让 TypeScript 从
super调用中推断出Base的类型参数。我怀疑{options: {foo: number}}和{options: {foo: 123}}的近乎重复是不可避免的。 -
@T.J.Crowder,我修复了链接。是的,该值在代码中是固定的,不会在运行时读取/构建。它实际上定义了这个特定类具有哪些特征,并且超类在 ctor 中提供了这个参数来动态生成这些特征。 (如果这有意义的话)当通过
new关键字调用 Base 类时,TS 能够以某种方式提取一些类型信息。所以我希望在扩展课程时同样的逻辑可以工作。但它只需要对 ts 代码进行一些更改。
标签: typescript typescript-generics