Skip to content

类型体操常用技巧

1. 字面量类型转string类型

ts
type Res = 'abc' & string
type Res = 'abc' & string

2. 触发类型计算

ts
type Res = Obj extends any ? xxx : never
type Res = Obj extends any ? xxx : never

3. 判断是否联合类型

js
type IsUnion<A, B = A> =
    A extends A // 触发联合类型
        ? [B] extends [A] // ['a' | 'b' | 'c'] extends 'a' 如果成立说明就不是联合类型,不成立就是联合类型
            ? false
            : true
        : never
type IsUnion<A, B = A> =
    A extends A // 触发联合类型
        ? [B] extends [A] // ['a' | 'b' | 'c'] extends 'a' 如果成立说明就不是联合类型,不成立就是联合类型
            ? false
            : true
        : never

4. 判断是否是any类型

any 类型与任何类型的交叉都是 any,也就是 1 & any 结果是 any。

ts
// 'guang' & T 如果是any 就说明 T是any
type IsAny<T> = 'dong' extends ('guang' & T) ? true : false
// 'guang' & T 如果是any 就说明 T是any
type IsAny<T> = 'dong' extends ('guang' & T) ? true : false

5. 判断两个类型是否相同

ts
type IsEqual2<A, B> = (<T>() => T extends A ? 1 : 2) extends (<T>() => T extends B ? 1 : 2)
    ? true : false;
type IsEqual2<A, B> = (<T>() => T extends A ? 1 : 2) extends (<T>() => T extends B ? 1 : 2)
    ? true : false;

6. 字面量类型支持string类型

ts
type MyType = 'warn' | 'danger' | (string & {});
type MyType = 'warn' | 'danger' | (string & {});