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;