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) {}