为什么不使用联合两侧的键导致TS抱怨?

时间:2019-04-23 23:09:07

标签: typescript

为什么这不会导致TS错误? TS playground

ebx

2 个答案:

答案 0 :(得分:0)

因为唯一会导致TS抱怨的是excess property check,而对于非歧视的联合体类型并没有做到这一点。 There's open issue for that,于2017年12月22日报道。

另请参阅Union type does not act as mutual exclusion,其答案是“从未想过”。

答案 1 :(得分:0)

为了获得互斥和多余的财产检查,一种解决方法是这样做

export type XOR<T, U> = (T | U) extends object ? (Without<T, U> & U) | (Without<U, T> & T) : T | U;
export type Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };


type T = XOR<{ a: string }, { b: string }>

const obj: T = {
  a: 'a',
} // passes

const obj1: T = {
  b: 'b',
} // passes

const obj2: T = {
  a: 'a',
  b: 'b',
} // fails