Typescript泛型类型检查无法按预期工作

时间:2018-03-06 15:57:08

标签: typescript generics

我做了一个简单的测试夹具:

export interface ITest1 {}
export interface ITest2 {}
export interface ITestGeneric<T> {}

export function test() {
  let p: ITestGeneric<ITest1> = {}
  let q: ITestGeneric<ITest2> = p;
}

我希望最后一行失败,因为在C#中这种不兼容的类型分配不起作用。但是,打字稿无需投诉即可编译。

有人可以告诉我为什么这样做有效以及我必须做些什么来使其失败?

3 个答案:

答案 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: {}};