为什么这不会导致TS错误? TS playground
ebx
答案 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