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

问题描述 投票:1回答:3

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

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

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

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

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

typescript generics
3个回答
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中阅读有关类型兼容性的更多信息


0
投票

我想因为你不限制

ITestGeneric <T>

它允许它。如果你这样做了

ITestGeneric<T extends ITest1>

这将更具限制性。

TypeScript泛型不是CSharp泛型,并且不是100%相同。

你的界面只是说它必须是任何东西的ITestGeneric。


0
投票

感谢@Titian Cernicova-Dragomir的建议,我提出了一个有效的解决方案。

要使类型与众不同,只需添加等于类型名称的属性:

export interface ITest1 { test1: any }
export interface ITest2 { test2: any }

就我测试而言,该属性的类型无关紧要。 Typescript似乎只查找属性的名称,如果不同,则类型不同。

实例化类型时,只需将属性设置为任何对象,空对象或空字符串,这并不重要。

let p: ITest1 = { test1: {}};
© www.soinside.com 2019 - 2024. All rights reserved.