具有泛型类型的成员不接受具体实例

时间:2017-11-08 20:14:39

标签: typescript generics compiler-errors

在以下示例中,TypeScript编译器不接受语句

this.iMember = new Two();

this.apply(this.member as T)

错误消息输入&#39;两个&#39;虽然在两种情况下 new Two()履行合同 extends IOne ,但不能分配给&#39; <&#39; 。有没有人知道为什么以及如何正确的代码应该是什么样的?

通过将示例粘贴到https://www.typescriptlang.org/play/

中可以重现问题

示例:

interface IOne{
    getOne(): string;
}
interface ITwo extends IOne
{
    getTwo(): number;
}
class Two implements ITwo{
     getOne(): string{
        return "One";
    }
    getTwo(): number{
        return 2;
    }
}
class Usage<T extends IOne> {
    iMember: T;
    member: Two;
    constructor(){
        this.iMember = new Two();
        this.member = new Two();
    }
    doApply() {
        this.apply(this.iMember);
        this.apply(this.member as T);
    }
    apply(obj: T)
    {
        let test = obj.getOne();     
    }
}

我尝试了与Java代码相同的示例。

interface IOne
{
    String getOne();
}

interface ITwo extends IOne
{
    int getTwo();
}

class Two implements ITwo
{
    @Override
    public String getOne()
    {
        return "One";
    }

    @Override
    public int getTwo()
    {
        return 2;
    }
}

class Usage<T extends IOne>
{
    T iMember;
    Two member;

    Usage()
    {
        this.member = new Two();
    }

    void doApply()
    {
        this.apply( this.iMember );
        this.apply( (T) this.member );
    }

    void apply( T obj )
    {
        String test = obj.getOne();
    }
}

在这种情况下,它适用于显式转换为T. 在Typescript世界中,它仍会导致相同的错误消息。 实际的问题是为什么它在Java中是合法的而在Typescript 中是不合法的?

0 个答案:

没有答案