以下是 TypeScript 中所有的工具类型(Utility Type)列表,按名字字母顺序排列:
Brand
Brand<T, U>
:给类型 T
添加一个特定标签类型 U
type Currency = Brand<number, 'currency'>;
const amount: Currency = 42;
// 下面的代码会报错,因为 Currency 类型只能赋值给 Currency类型
const total: number = amount;
Capitalize
Capitalize<T>
:将字符串类型 T
的第一个字符转换为大写
type Title = 'alice in wonderland';
type CapitalizedTitle = Capitalize<Title>; // 类型为 'Alice in wonderland'
ConditionalExcept
ConditionalExcept<T, U, V>
:根据条件将类型 T
中的某些属性剔除
interface User {
name: string;
email: string | null;
age?: number;
}
// 排除 User 类型中所有可能为 null 的属性
type UserNotNull = ConditionalExcept<User, null>;
// 类型为 { name: string; age?: number; }
ConstructorParameters
ConstructorParameters<T>
:获取构造函数 T
的参数类型数组
class Person {
constructor(public name: string, public age: number) {}
}
type PersonParams = ConstructorParameters<typeof Person>; // 类型为 [string, number]
Diff
Diff<T extends object, U extends object>
:计算类型 T
和类型 U
的属性差集
interface Person {
name: string;
email: string;
age: number;
}
interface User {
name: string;
email: string;
}
type PersonWithoutUserProps = Diff<Person, U>; // 类型为 { age: number; }
Exclude
Exclude<T, U>
:从类型 T
中剔除可以赋值给类型 U
的类型
type NumberOrString = number | string;
type OnlyNumber = Exclude<NumberOrString, string>; // 类型为 number
ExcludeKeys
ExcludeKeys<T, U>
:从类型 T
中剔除属性名为联合类型 U
中的属性,并创建一个新类型
interface User {
name: string;
email: string;
age: number;
}
type UserWithoutName = ExcludeKeys<User, 'name' | 'email'>; // 类型为 { age: number; }
Extract
Extract<T, U>
:从类型 T
中提取可以赋值给类型 U
的类型
type NumberOrString = number | string;
type OnlyString = Extract<NumberOrString, string>; // 类型为 string
ExtractKeys
ExtractKeys<T, U>
:从类型 T
中提取属性名为联合类型 U
中的属性,并创建一个新类型
interface User {
name: string;
email: string;
age: number;
}
type UserWithoutName = ExtractKeys<User, 'age'>; // 类型为 { age: number; }
InferType
InferType<T>
:从函数或类中的 return
类型中推断出类型
type InferenceResult<T> = T extends (params: infer P) => infer R? [P, R] : never;
function greet(name: string) {
return `Hello, ${name}!`;
}
type GreetResult = InferType<typeof greet>; // 类型为 [string, string]
InstanceType
InstanceType<T>
:获取构造函数 T
返回的实例类型
class Person {
constructor(public name: string, public age: number) {}
}
type PersonInstance = InstanceType<typeof Person>; // 类型为 Person
Introspect
Introspect<T>()
:获取接口类型 T
的属性键的联合类型
type IntrospectedPerson = Introspect<Person>();
// 类型为
// {
// Alice: "Alice";
// Bob: "Bob";
// Charlie: "Charlie";
// }
Immutable
Immutable<T>
:将类型 T
中所有属性设为不可变的
interface User {
name: string;
email: string;
}
type ImmutableUser = Immutable<User>; // 类型为 { readonly name: string; readonly email: string; }
Mutable
Mutable<T>
:将类型 T
中所有属性设为可变的
interface User {
readonly name: string;
readonly email: string;
}
type MutableUser = Mutable<User>; // 类型为 { name: string; email: string; }
NonNullable
NonNullable<T>
:将类型 T
中的 null
和 undefined
类型排除
interface User {
name: string;
age: number | null;
}
type UserInfoWithoutNull = {
name: string;
age: NonNullable<User['age']>; // 类型为 number,没有 null
};
Omit
Omit<T, K>
:从类型 T
中排除属性 K
并创建一个新类型
interface User = {
name: string;
email: string;
age: number;
}
type UserBasicInfo = Omit<User, 'age'>; // 类型为 { name: string; email: string; }
Partial
Partial<T>
:将类型 T
中所有属性设为可选
interface User {
name: string;
email: string;
}
type PartialUser = Partial<User>; // 类型为 { name?: string; email?: string; }
PartialWithDeepNonNullable
PartialWithDeepNonNullable<T>
:将类型 T
中所有嵌套的属性设为可选但非空
interface User {
name: string;
contact: {
email: string | null;
phone?: string | null;
};
}
type UserWithRequiredContactEmail = PartialWithDeepNonNullable<User>;
// 类型为 { name?: string; contact: { email: string; phone?: string | null | undefined; } | undefined; }
Pick
Pick<T, K>
:提取类型 T
中指定属性 K
形成新的类型
interface User {
name: string;
email: string;
age: number;
}
type UserBasicInfo = Pick<User, 'name' | 'email'>; // 类型为 { name: string; email: string; }
PickByValueType
PickByValueType<T, U>
:从类型 T
中选出值类型为 U
的属性名 并创建一个 new 类型
interface User {
name: string;
age: number;
email: string;
verified: boolean;
}
type StringProps = PickByValueType<User, string>; // 类型为 "name" | "email"
Record
Record<K, T>
:创建一个从类型 K
中的属性名到类型 T
的映射类型
type Person = 'Alice' | 'Bob' | 'Charlie';
type AgeMap = Record<Person, number>; // 类型为 { Alice: number; Bob: number; Charlie: number; }
RecordValue
RecordValue<K, V>
:创建一个从类型 K
中的属性名到类型 V
的映射类型
type Person = 'Alice' | 'Bob' | 'Charlie';
type AgeMap = RecordValue<Person, number>; // 类型为 { Alice: number; Bob: number; Charlie: number; }
RequireAtLeastOne
RequireAtLeastOne<T>
:确保类型 T
中至少有一个属性
interface User {
name?: string;
email?: string;
}
type UserWithRequiredNameOrEmail = RequireAtLeastOne<User>; // 类型为 { name: string; } | { email: string; }
ReturnType
ReturnType<T>
:获取函数 T
的返回值类型
function greet(name: string) {
return `Hello, ${name}!`;
}
type GreetReturn = ReturnType<typeof greet>; // 类型为 string
ThisParameterType
ThisParameterType<T>
:获取函数 T
中的 this
参数类型
type ThisType = { name: string };
function bindName(this: ThisType) {
return this.name;
}
type BoundName = ThisParameterType<typeof bindName>; // 类型为 { name: string }
Tuple
Tuple<T>
:将类型 T[]
可转换为元组类型
type Pair = [number, string];
type FirstOfPair = Tuple<number>; // 类型为 [number, number]
UnionToIntersection
UnionToIntersection<T>
:将并集类型转换为交集类型
type Intersection<T extends unknown[]> = UnionToIntersection<T[number]>;
type Example = Interception<[1, 2, 3]>;
// 类型为 1 & 2 & 3
Uncapitalize
Uncapitalize<T>
:将字符串类型 T
的第一个字符转换为小写
type Title = 'ALICE IN WONDERLAND';
type UncapitalizedTitle = Uncapitalize<T>; // 类型为 'aLICE IN WONDERLAND'
Merge
Merge<MergeType>
:合并两个或更多类型
interface Person = {
name: string;
}
interface User = {
email: string;
}
type PersonAndUser = Merge<Person, User>; // 类型为 { name: string; email: string; }
这些工具类型在不同的情况下可以帮助我们更方便地创建和处理 TypeScript 类型。详细的使用方法可以参考 TypeScript 官方文档中有关工具类型的章节。