考虑以下 Typescript 片段:
class Animal {
constructor(name: string) {
this.name = name;
}
name: string;
haveBaby(name: string): ?? return type ?? {
return new this.constructor(name); // Error
}
}
class Cat extends Animal {}
class Dog extends Animal {}
class Gerbil extends Animal {} // etc.
let sorachi = new Cat("Sorachi"); // a: Cat
let sorachiJr = a.haveBaby("Sorachi Jr."); // I want: sorachiJr: Cat
动物可以生孩子,并且孩子应该与父母是同一种类的动物,即应该是与父母同一类的实例。在这种情况下如何分配类型,以便 Typescript 知道sorachiJr: Cat
?
上面的代码片段不起作用。线路return new this.constructor(name)
产生错误[ts] Cannot use 'new' with an expression whose type lacks a call or construct signature.
在 VS 代码中。我能够找到和理解的唯一解决方案是替换this.constructor(name)
with (<any>this.constructor)(name)
or (<any>this).constructor(name)
,但随后推断出的类型sorachiJr
is any
,也,而不是Cat
。我尝试投射到typeof this
而不是any
,但出现错误[ts] Cannot find name 'this'
.
我如何才能让 Typescript 相信生孩子是一项物种保护行动?
保留调用方法的类的类型很容易,我们只需使用多态this
类型。为了让 ts 相信constructor
将是一个构造函数,它需要一个string
并返回一个与当前类相同类型的实例,需要类型断言
type AnimalConstructor<T extends Animal> = new (name: string) => T
class Animal {
constructor(name: string) {
this.name = name;
}
name: string;
haveBaby(name: string): this {
return new (this.constructor as AnimalConstructor<this>)(name);
}
}
class Cat extends Animal {}
class Dog extends Animal {}
class Gerbil extends Animal {} // etc.
let sorachi = new Cat("Sorachi"); // a: Cat
let sorachiJr = sorachi.haveBaby("Sorachi Jr.");
NoteTypescript 无法验证派生类构造函数只需要一个事实string
参数,它可能需要更多或更少的参数。这使得这个构造函数不是类型安全的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)