TS类型操作工具汇总
TypeScript 提供了一套强大的类型操作工具,可以帮助我们创建复杂的类型系统
基础类型工具
Partial<T> :
将所有属性变为可选
interface User {name: string;age: number;
}
type PartialUser = Partial<User>; // { name?: string; age?: number; }
Required<T>:
将所有属性变为必需
type RequiredUser = Required<PartialUser>; // 恢复为原始User类型
Readonly<T>:
将所有属性变为只读
type ReadonlyUser = Readonly<User>;
结构操作工具
Pick<T, K>:
选择部分属性
type NameOnly = Pick<User, 'name'>; // { name: string }
Omit<T, K>:
排除部分属性
type WithoutAge = Omit<User, 'age'>; // { name: string }
Record<K, T>:
创建键值类型
type UserMap = Record<string, User>; // { [key: string]: User }
联合类型工具
Exclude<T, U>:
从T中排除U
type T = 'a' | 'b' | 'c';
type Result = Exclude<T, 'a'>; // 'b' | 'c'
Extract<T, U>:
提取T中符合U的类型
type Result = Extract<T, 'a' | 'd'>; // 'a'
NonNullable<T>:
排除null和undefined
type T = string | null | undefined;
type Result = NonNullable<T>; // string
函数类型工具
Parameters<T>:
获取函数参数类型
type Fn = (a: number, b: string) => void;
type Params = Parameters<Fn>; // [number, string]
ReturnType<T>:
获取函数返回值类型
type Ret = ReturnType<Fn>; // void
ConstructorParameters<T>:
获取构造函数参数类型:
class C {constructor(a: number, b: string) {}
}
type CP = ConstructorParameters<typeof C>; // [number, string]
高级类型操作
条件类型
type IsString<T> = T extends string ? true : false;
type A = IsString<'hello'>; // true
type B = IsString<123>; // false
映射类型
type Getters<T> = {[K in keyof T as `get${Capitalize<string & K>}`]: () => T[K];
};
type UserGetters = Getters<User>;
// { getName: () => string; getAge: () => number; }
模板字面量类型
type EventName = 'click' | 'scroll';
type HandlerName = `on${Capitalize<EventName>}`;
// "onClick" | "onScroll"
实用工具类型
Awaited<T>:
解开Promise类型
type P = Promise<string>;
type Res = Awaited<P>; // string
ThisParameterType<T>:
获取函数的this参数类型
function f(this: { name: string }) {}
type This = ThisParameterType<typeof f>; // { name: string }