导致此代码失败的原因是什么?
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
答案 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;