fatme
2024-12-22
来自广东
探究了一下 IsUnion_4 和 IsUnion_1 的区别: type IsUnion_4<T> = [T] extends [infer U] ? U extends infer t ? ([T] extends [t] ? false : true) : never : never; type IsUnion_4_Test_7<T> = [T] extends [infer U] ? [T] : never; // 这里第二个 [T] 与第一个 [T] 一样,为 ["a" | "b"] type IsUnion_4_Test_3<T> = [T] extends [infer U] ? U extends infer t ? [T] : never : never; // 这里第二个 [T] 与第一个 [T] 不一样,变为 ["a"] | ["b"] type IsUnion_4_Test_6<T> = [T] extends [infer U] ? U extends infer t ? [T, t] : never : never; type T22 = IsUnion_4_Test_7<'a'|'b'>; // ["a" | "b"] type T7 = IsUnion_4_Test_3<'a'|'b'>; // ["b"] | ["a"] type T13 = IsUnion_4_Test_6<'a'|'b'>; // 得到 ["a", "a"] | ["b", "b"],说明 IsUnion_4 里面的 [T] extends [t] ? false : true 是分别用 "a"/"a" 和 "b"/"b" 来比较判断,所以返回 false type IsUnion_1<T> = [T, T] extends [infer U, infer U2] ? U extends infer t ? ([T] extends [t] ? false : true) : never : never; type IsUnion_1_Test_3<T> = [T, T] extends [infer U, infer U2] ? U extends infer t ? [T, t] : never : never; type T14 = IsUnion_1_Test_3<'a'|'b'>; // // 得到 ["a" | "b", "a"] | ["a" | "b", "b"],说明 IsUnion_1 里面的 [T] extends [t] ? false : true 是分别用 ("a" | "b")/"a" 和 ("a" | "b")/"b" 来比较判断,所以返回 true
展开