我做了一个简单的测试夹具:
export interface ITest1 {}
export interface ITest2 {}
export interface ITestGeneric<T> {}
export function test() {
let p: ITestGeneric<ITest1> = {}
let q: ITestGeneric<ITest2> = p;
}
我希望最后一行失败,因为在C#中这种不兼容的类型分配不起作用。但是,打字稿无需投诉即可编译。
有人能告诉我为什么这样做有效以及我必须做些什么来使其失败?
这是因为typescript使用结构兼容性来确定两种类型是否兼容。在你的情况下,因为ITestGeneric
没有成员,它基本上与任何东西兼容。如果您开始添加属性,将很快出现不兼容性:
export interface ITest1 { t1: string}
export interface ITest2 { t2: number}
export interface ITestGeneric<T> { value: T}
export function test() {
let p: ITestGeneric<ITest1> = {} // error
let q: ITestGeneric<ITest2> = p; // error
}
您可以在typescript here中阅读有关类型兼容性的更多信息
我想因为你不限制
ITestGeneric <T>
它允许它。如果你这样做了
ITestGeneric<T extends ITest1>
这将更具限制性。
TypeScript泛型不是CSharp泛型,并且不是100%相同。
你的界面只是说它必须是任何东西的ITestGeneric。
感谢@Titian Cernicova-Dragomir的建议,我提出了一个有效的解决方案。
要使类型与众不同,只需添加等于类型名称的属性:
export interface ITest1 { test1: any }
export interface ITest2 { test2: any }
就我测试而言,该属性的类型无关紧要。 Typescript似乎只查找属性的名称,如果不同,则类型不同。
实例化类型时,只需将属性设置为任何对象,空对象或空字符串,这并不重要。
let p: ITest1 = { test1: {}};