我有以下课程:
class MyClass {
public each<T extends MyClass>(callback: (item: T) => void): T {
/* Loop through an array and apply the callback */
return this;
}
}
class MyClass2 extends MyClass {
public before(html: string): MyClass2 {
return this.each<MyClass2>(item => { /* Do Some Stuff */ });
}
}
然后我收到了这个错误:
[ts]输入'this'不能指定为'T'。
如何返回类实例?
答案 0 :(得分:3)
要返回MyClass
的实例,您需要将返回类型更改为MyClass
public each<T extends MyClass>(callback: (item: T) => void): MyClass {
/* Loop through an array and apply the callback */
return this;
}
答案 1 :(得分:3)
您可以使用this type来表示each
返回与其相同类型的实例:
class MyClass {
public each<T extends MyClass>(callback: (item: T) => void): this {
/* Loop through an array and apply the callback */
return this;
}
}
class Derived extends MyClass {
foo: string;
}
let derived = new Derived;
derived = derived.each(() => {});
请注意,此类型与T
不同 - T是数组项的类型,它可能与您调用each
方法的实例类型相同或不同。
答案 2 :(得分:1)
在each
方法中,您应该返回基类,因为this
指的是MyClass
类型。在before
方法中,您可以将MyClass
对象强制转换回MyClass2
对象。
class MyClass {
public each<T extends MyClass>(callback: (item: T) => void): MyClass {
/* Loop through an array and apply the callback */
return this;
}
}
class MyClass2 extends MyClass {
public before(html: string): MyClass2 {
return <MyClass2>this.each(item => { /* Do Some Stuff */ });
}
}
检查它是否转换并返回MyClass2
的实例:
let myclass2 = new MyClass2();
console.log(myclass2.before('') instanceof MyClass2); // returns true
答案 3 :(得分:0)
你正在尝试做的事情被称为向下转换:你的函数返回一个T,它是MyClass的子类,但你的实际返回类型是MyClass,它是T的超类。
通过继承的多态性通常允许你上升而不是下降,因为子类型通常更宽(更多的字段)并且你最终使用的对象没有你拥有的所有属性。期待。
我对打字稿不是很熟悉,但我发现你可以通过这样的转型让它飞起来
return <MyClass>this;
它应该有效,但由于上述原因,它通常被认为是不好的做法。
有关打字稿中的transtyping的详细信息,请参阅http://blogs.microsoft.co.il/gilf/2013/01/18/using-casting-in-typescript/。