Typescript中接口的类级泛型约束

时间:2017-04-03 15:11:13

标签: generics typescript

导致此代码失败的原因是什么?

interface ISomeData {
    name: string;
}

class SomeData implements ISomeData {
    name: string = "adam";
}

class SomeClass<T extends ISomeData> {
    constructor(dataTemplate?: T) {
        this.dataTemplateInternal = dataTemplate;
    }

    private dataTemplateInternal: T;

    public initSomeData() : T {
        let data: T = new SomeData();
        if (this.dataTemplateInternal) {
            return this.dataTemplateInternal;
        }
        return data;
    }
}

&#34; initSomeData&#34;的第一行有一个错误说

  

键入&#39; SomeData&#39;不能分配给&#39; T&#39;

但是因为我的泛型约束是基于SomeData实现的接口,所以不应该足够吗?

Ridiculously long link to this code in the TypeScript Playground

1 个答案:

答案 0 :(得分:2)

如果您这样做:

let data: ISomeData = new SomeData();

您不会收到此错误,但T不是ISomeData,而是&#34;更多&#34;比ISomeData,例如它可以是:

interface IMoreData extends ISomeData {
    username: string;
}

然后你说:

let data: IMoreData = new SomeData();

这是不对的,因为它错过了username属性 您可以通过告诉编译器您知道自己在做什么(AKA转换)来解决这个问题:

let data: T = new SomeData() as T;

或者只是:

let data = new SomeData() as T;