问题描述
我是Typescript的新手,因此很抱歉。 我有一个与之相关的类和类型,如下所示。
interface childType {
a: string;
b: string;
}
class Child extends Parent {
instanceVar: childType
}
该类从Parent扩展。
在父级中,instanceVar类型为Record
class Parent {
instanceVar: Record<string,string>
constructor(iV: Record<string,string>) {
this.instanceVar = iV;
}
getAllValues = (): Array<string> =>{
let values : Array<string> = [];
Object.keys(this.instanceVar).forEach((key) => {
let val = this.instanceVar[key];
values.push(val);
})
return values;
}
}
这当前不起作用,打字稿抱怨孩子中的instanceVar与父类型不同。但对我而言,这是因为“ childType”基本上是一个Record(将字符串映射到字符串),但是更“特定”。
我知道我可以使用泛型解决类型错误,但是我的真正目标是不必重写子类中的getValues函数。我想在父类中编写一次getValues,并将其应用于所有子类。这意味着子类中的instanceVar以某种方式从Record类型“继承”其类型。
解决方法
您可以使它成为父级的通用参数,而不是在子级中重新定义instanceVar
。这也需要对Object.keys
的值进行类型断言,因为默认情况下Typescript键入的类型要比您想要的宽得多,但这是非常标准的。试试:
class Parent<T extends Record<keyof T,string>> {
instanceVar: T
constructor(iV: T) {
this.instanceVar = iV;
}
getAllValues = (): Array<string> =>{
let values : Array<string> = [];
const keys = Object.keys(this.instanceVar) as (keyof T)[] // <-- type assertion
keys.forEach((key) => {
let val = this.instanceVar[key];
values.push(val);
})
return values;
}
}
interface childType {
a: string;
b: string;
}
class Child extends Parent<childType> {
}