我做了一个简单的测试夹具:
export interface ITest1 {}
export interface ITest2 {}
export interface ITestGeneric<T> {}
export function test() {
let p: ITestGeneric<ITest1> = {}
let q: ITestGeneric<ITest2> = p;
}
我希望最后一行失败,因为在C#中这种不兼容的类型分配不起作用。但是,打字稿无需投诉即可编译。
有人可以告诉我为什么这样做有效以及我必须做些什么来使其失败?
答案 0 :(得分:5)
这是因为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
中详细了解类型兼容性答案 1 :(得分:0)
我认为既然你没有限制
ITestGeneric <T>
它允许它。如果你做了
ITestGeneric<T extends ITest1>
这将更具限制性。
TypeScript泛型不是CSharp泛型,并且不是100%相同。
你的界面只是说它必须是任何东西的ITestGeneric。
答案 2 :(得分:0)
感谢@Titian Cernicova-Dragomir的建议,我提出了一个有效的解决方案。
要使类型与众不同,只需添加等于类型名称的属性:
export interface ITest1 { test1: any }
export interface ITest2 { test2: any }
就我所测试而言,物业的类型并不重要。 打字稿似乎只查找属性的名称,如果不同,则类型不同。
实例化类型时,只需将属性设置为任何对象,空对象或空字符串,它并不重要。
let p: ITest1 = { test1: {}};