我有这种类型
type Cartesian = { kind: 'cartesian'; x: number; y: number; }
type Polar = { kind: 'polar'; angle: number; distance: number }
type Movement = { name: string } & (Cartesian | Polar);
我可以这样使用
const move = (movement: Movement) => { /* whatever */ };
move({ name: 'top right', kind: 'cartesian', x: 10, y: 10 });
move({ name: 'left', kind: 'polar', angle: Math.PI, distance: 10 });
但出于某种原因,我不能这样使用它
const unnamedMove = (unnamedMovement: Omit<Movement, 'name'>) => {
move({ name: 'default', ...unnamedMovement })
}
因为TS抛出2345:
Argument of type '{ kind: "cartesian" | "polar"; name: string; }' is not assignable to parameter of type 'Movement'.
Type '{ kind: "cartesian" | "polar"; name: string; }' is not assignable to type '{ name: string; } & Polar'.
Type '{ kind: "cartesian" | "polar"; name: string; }' is missing the following properties from type 'Polar': angle, distance
我不明白这一点.
如果我没有弄错的话,Omit<Movement, 'name'>
应该相当于Cartesian | Polar
型的联合体,这将使{ name: 'default', ...unnamedMovement }
成为Movement
,所有的东西都应该工作.
然而,看起来TS推断Omit<Movement, 'name'>
就像它是联合类型Cartesian & Polar
一样,因此是错误的.
这是我的错误还是错误?