typescript 类型体操

为什么 [U] [T] 换个位置,下面的结果就是不同了呢

type case1 = IsUnion<string> // false
type case2 = IsUnion<string | number> // true
type case3 = IsUnion<[string | number]> // false

type IsUnion<T, U = T> = T extends U ? ([U] extends [T] ? false : true) : never
type IsUnion2<T, U = T> = T extends U ? ([T] extends  [U] ? false : true) : never
阅读 1.5k
2 个回答
//isUnion<string | number>的展开
//true
type IsUnion_<_string_or_number_> = string extends string|number ? ([string|number] extends [string] ? false : true) : never | number extends string|number ? ([string|number] extends [number] ? false : true) : never;

//isUnion2<string | number>的展开
//false
type IsUnion2_<_string_or_number_> = number extends string|number ? ([number] extends [string|number] ? false : true) : never | string extends string|number ? ([string] extends [string|number] ? false : true) : never
type Iu<T, U = T> = T extends U ? ([T]) : never

type case2_it = Iu<string | number> // [string] | [number]

经过 T extends U 的判断,T 的类型不再是 string | number (这是一个类型),而是 stringnumber (这是两个类型)。于是加上 [] 之后变成了 [string] | [number] 。而 U 依然是 string | number 。于是 [string|number] extends [string] | [number] 为假

但是T 是 [string|number] 的时候,T extends U 不会引起类似变换,[U] extends [T] 的检验是 [[string|number]] extends [[string|number]] ,于是为真。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进