在 TypeScript(我使用Playground,版本 4.13)中,当我从一个类继承时,父类this
的方法内部static
似乎是指继承类:
class Parent{
static ID = 0
public id: number
static create(){
return new this(this.ID)
}
constructor(id: number){
this.id = id
}
}
class Child extends Parent{
static ID = 1
}
let child = Child.create()
console.log(child.id) // 1
但是,当我想根据子类的类型定义一些行为时,我遇到了问题:
class Parent{
static create(data: object){
let instance = new this
for (let [key, value] of Object.entries(data)){
this[key] = value
}
return instance
}
}
class Child extends Parent{
id: number | null = null
}
let child = Child.create({id: 1})
console.log(child.id)
这给了我
元素隐式具有“任何”类型,因为表达式类型为“字符串 | 号码 | 符号'不能用于索引类型'typeof Parent'。在“typeof Parent”类型上找不到带有“string”类型参数的索引签名。
我试图通过类型转换key
作为子类的键来解决这个问题:
class Parent{
static create(data: object){
let instance = new this
for (let [key, value] of Object.entries(data)){
this[key as keyof this] = value
}
return instance
}
}
class Child extends Parent{
id: number | null = null
}
let child = Child.create({id: 1})
console.log(child.id)
但这是被禁止的。我明白了
“this”类型仅在类或接口的非静态成员中可用
另外,我得到(在所有情况下)
“父”类型上不存在属性“id”。
如何解决我的问题 - 从对象(我在现实世界场景中从 API 接收)动态填充子类的属性?