输入'this'不能指定为'T'

时间:2016-10-26 21:46:12

标签: javascript typescript

我有以下课程:

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'。

如何返回类实例?

4 个答案:

答案 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/