Generics Typescript中接口的类级泛型约束

Generics Typescript中接口的类级泛型约束,generics,typescript,Generics,Typescript,是什么导致此代码失败 interface ISomeData { name: string; } class SomeData implements ISomeData { name: string = "adam"; } class SomeClass<T extends ISomeData> { constructor(dataTemplate?: T) { this.dataTemplateInternal = dataTemplat

是什么导致此代码失败

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;
    }
}
接口数据{
名称:字符串;
}
类SomeData实现了ISomeData{
名称:string=“adam”;
}
上课{
构造函数(数据模板?:T){
this.dataTemplateInternal=dataTemplate;
}
私有数据模板内部:T;
public initSomeData():T{
let data:T=new-SomeData();
if(this.dataTemplateInternal){
返回此.dataTemplateInternal;
}
返回数据;
}
}
“initSomeData”的第一行有一个错误

类型“SomeData”不可分配给类型“T”

但由于我的通用约束是基于接口的,SomeData实现了接口,这难道还不够吗

如果您愿意:

let data: ISomeData = new SomeData();
您不会得到此错误,但
t
不是
isomdata
,它比
isomdata
更重要,例如:

interface IMoreData extends ISomeData {
    username: string;
}
然后你说:

let data: IMoreData = new SomeData();
这是不正确的,因为它缺少
username
属性。
您可以通过告诉编译器您知道自己在做什么来解决此问题(也称为强制转换):

或者只是:

let data = new SomeData() as T;

谢谢,就这样!我有点想这就是我需要做的,不知道为什么我不试一下!作为一个附带问题,约束不是说“您的实现必须是[THIS]的最小值”(在我的例子中是
接口数据{name:string}
),并且实现该接口不是确保它具有“name:string”吗?我仍然不太明白为什么它不能含蓄地理解我在那里的意图。这是出于设计,还是像语言规范中的“待办事项”尽管如此,你还是很摇滚,谢谢!是的,通用约束确保
name
存在于
T
中,但是
T
不是
isomdata
,因此编译器会警告您。如果您有一个
SomeClass
的实例,那么
initSomeData
的结果应该是
IMoreData
类型,而不是
isomdata
let data = new SomeData() as T;