Typescript 我有一个类型,它是两个接口的并集,两个接口在一个属性上不同,为什么可以';当我省略一个公共属性并将其加回去时,t t识别吗?

Typescript 我有一个类型,它是两个接口的并集,两个接口在一个属性上不同,为什么可以';当我省略一个公共属性并将其加回去时,t t识别吗?,typescript,Typescript,是带有此问题代码的打字脚本,如下所示 本质上 enum Color { Red = "RED", Orange = "ORANGE" } enum Package { Single = "SINGLE", Multiple = "MULTIPLE" } export interface ShipmentSingle { id: string; color: Color, package: Package.Single } export interface Ship

是带有此问题代码的打字脚本,如下所示

本质上

enum Color {
  Red = "RED",
  Orange = "ORANGE"
}

enum Package {
  Single = "SINGLE",
  Multiple = "MULTIPLE"
}
export interface ShipmentSingle {
  id: string;
  color: Color,
  package: Package.Single
}

export interface ShipmentMultiple {
  id: string;
  color: Color,
  package: Package.Multiple,
  quantity: number
}

type Shipment = ShipmentSingle | ShipmentMultiple

const s: Shipment = {
  id: '1', 
  color: Color.Red,
  package: Package.Single 
}


const addIdToOrder = (shipment: Omit<Shipment, 'id'>): Shipment => ({
  ...shipment,
  id: '2'
})

枚举颜色{
Red=“Red”,
橙色=“橙色”
}
枚举包{
Single=“Single”,
Multiple=“多个”
}
导出接口ShipmentSingle{
id:字符串;
颜色:颜色,
套餐:套餐,单人
}
导出接口ShipmentMultiple{
id:字符串;
颜色:颜色,
包:包。多个,
数量:个
}
装运类型=单次装运|多次装运
施工:装运={
id:'1',
颜色:颜色,红色,
套餐:套餐,单人
}
const addIdToOrder=(装运:忽略):装运=>({
…装运,
id:'2'
})
我看到了错误

类型“{id:string;color:color;package:package;}”不可分配给类型“shipping”。 类型“{id:string;color:color;package:package;}”中缺少属性“quantity”,但类型“ShipmentMultiple”中需要该属性


这是为什么?

发生错误的原因是
忽略
内部使用
keyof T
keyof T
应用于联合类型(
shipping
为联合类型)时,只返回联合所包含的两种类型中存在的键

type Keys = keyof Shipment; // Keys = 'id' | 'color' | 'package'.
原因是

因此,
ommit
生成具有
color
package
属性的对象<代码>数量
不存在

为了解决此问题,我可能建议首先将
装运
分发到
装运单次
装运多次
,然后对每一次分发应用
省略
。所以结果将再次是并集类型

type OmitWithDistribution<T, K extends keyof T> = T extends any ? Omit<T, K> : never;

const addIdToOrder = (shipment: OmitWithDistribution<Shipment, 'id'>): Shipment => ({
    ...shipment,
    id: '2'
})
类型ommitWithDistribution=T扩展了任何?省略:从不;
const addIdToOrder=(发货:忽略配送):发货=>({
…装运,
id:'2'
})