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