Typescript 为什么这些结构相似的类型不兼容?
如果我声明以下类型:Typescript 为什么这些结构相似的类型不兼容?,typescript,Typescript,如果我声明以下类型: export type Type1 = { id: string } | { id: number }; export type Type2 = { id: string } | { id: number }; 以以下方式使用时,为什么会出现错误: function displayItem(item: Type1) { loadItem({ id: item.id }); // error is indicated here } function
export type Type1 = { id: string } | { id: number };
export type Type2 = { id: string } | { id: number };
以以下方式使用时,为什么会出现错误:
function displayItem(item: Type1) {
loadItem({ id: item.id }); // error is indicated here
}
function loadItem(item: Type2) {}
我的理解是,它们应该是等价的,因为它们在结构上是相同的
根据答案进行更简单的复制(不需要第二种类型):
这并不是说
Type1
不等同于Type2
例如,以下内容不会给出错误
功能显示项(项:类型1){
装载物品(物品);
}
函数loadItem(项:Type2){}
当您键入item.id
时会出现问题,这可能是两件事。因为Type1
被定义为export-type-Type1={id:string}{id:number}代码>
此变量的类型可以是string
或number
。因此,typescript为{id:item.id}
创建了另一个类型,即{id:number | string}
,正如您所看到的,它与Type2
不兼容
您必须显式地编写要使用的类型
下面不会给出任何错误
功能显示项(项:类型1){
loadItem({id:item.id作为编号});
}
现在,我将item.id
标记为number
所以{id:item.id为number}
的类型是{id:number}
,它与Type2
兼容
只需将您的类型更改为以下类型
导出类型Type1={id:string | number};
导出类型Type2={id:string | number};
在深度方面,您试图将类型为number | string
的值分配为number
或字符串
由于您正在访问item.id
,id
可以是string
或number
,具体取决于您的类型定义。您的Type2
需要一个对象{id:string}
或{id:number}
,它与{id:string | number}
不同
因此,两种不同的情况可以解决这一灾难
声明您的Type2
需要一个名为id
的键,它是number | string
将整个项
对象传递给第二个函数。这就是所谓的类型兼容性
很好,我错过了手动强制输入的要点。但它应该取决于id
类型,而不是硬编码。不管怎样,很好point@VRoxare“但它应该取决于id类型,而不是硬编码”-这可能吗?我也不想硬编码。不,据我所知,你不能。如果您将其设置为dependent,则会得到一个string | number
类型,这实际上与您以前得到的类型相同。只需将您的类型设置为Type1={id:string | number}
@BunyaminCoskuner更改Type1
就会给出相同的错误。以相同的方式更改Type2
可以消除错误,但这是一个外部类型,我无法修改。感谢提出的解决方案,但是我无法执行这两个操作,因为Type2在外部库中定义,与第二个函数的参数类型一样。还有其他想法吗?为什么不loadItem(item)代码>?(即使是明确的loadItem(项目类型为2);
)我的实际案例比示例更复杂,这意味着我无法使用loadItem(项目)
,但您的第二个建议的一个变体是有效的。谢谢
export type Type1 = { id: string } | { id: number };
function displayItem(item: Type1) {
loadItem({ id: item.id }); // error is indicated here
}
function loadItem(item: Type1) {}