为什么在联合体上使用交集时类型不缩小

时间:2019-05-08 06:40:49

标签: typescript

type X = { a: 1; b: number } | { a: 2; b: string };
declare const foo: X & { a: 1 };
foo.b.toFixed(0);
//    ~~~~~~~
// Property 'toFixed' does not exist on type 'string'.

我希望使X{ a: 1 }相交会消灭{ a: 2, … }部分,因此foo实际上就是{ a: 1; b: number }

这为什么不起作用?

1 个答案:

答案 0 :(得分:1)

这不是交叉路口的工作方式,交叉路口意味着结果类型必须规定交叉路口的所有成员,无论实际上是否可行。

您要寻找的是Extract条件类型

type X = { a: 1; b: number } | { a: 2; b: string };
declare const foo: Extract< X, { a: 1 }>
foo.b.toFixed(0);