Skip to content

TypeScript 工具类型 详解

TypeScript 内置的工具类型以及与它们相伴的关键字,按用途分组:重塑对象、过滤联合类型、描述函数、转换字面量字符串,以及从值中捕获类型。每行展示该类型和一个你会真正写出的别名。

工具类型是作用于类型的泛型函数:接收一个或两个类型,返回一个新类型,这样你就不必手动写出每一种形状。它们在派生类型上大放异彩——当唯一事实来源是另一个类型或一个值,而你希望自己的类型自动跟踪它的时候。经验法则是派生而非复制:改了源头,派生类型随之改变。

参考表格 · 22 条目
22 of 22 rows
对象形状
T 的所有属性都变为可选。type Update = Partial<User>
T 的所有属性都变为必填。type Strict = Required<Opts>
T 的所有属性都变为只读。type Frozen = Readonly<User>
T 只保留 K 中的键。type Preview = Pick<User, "id" | "name">
T 移除 K 中的键。type SafeUser = Omit<User, "password">
键为 K、值为 V 的对象。type Scores = Record<string, number>
联合类型过滤
从联合类型 U 中移除可赋值给 X 的成员。type NoNull = Exclude<T, null>
U 中可赋值给 X 的成员。type OnlyStr = Extract<T, string>
T 移除 null 和 undefined。type Def = NonNullable<T>
函数类型
由函数 F 的参数类型组成的元组。type P = Parameters<typeof fn>
函数 F 返回的类型。type R = ReturnType<typeof fn>
由构造函数 F 的参数类型组成的元组。type C = ConstructorParameters<typeof Date>
构造函数 F 产生的实例类型。type D = InstanceType<typeof Date>
Promise 递归解析后得到的类型。type Data = Awaited<Promise<User>>
字面量字符串转换
大写形式的字符串字面量 S。type A = Uppercase<"abc"> // "ABC"
小写形式的字符串字面量 S。type B = Lowercase<"ABC"> // "abc"
首字符大写的 S。type C = Capitalize<"abc"> // "Abc"
首字符小写的 S。type D = Uncapitalize<"Abc"> // "aBc"
相关关键字
对象类型 T 的属性键组成的联合类型。type K = keyof User
值的类型,无需再写一遍。type Config = typeof defaults
在条件类型内部捕获一个类型以供复用。type El<T> = T extends Array<infer I> ? I : never
根据 T 是否可赋值给 U 来选择类型 X 或 Y。type IsStr<T> = T extends string ? true : false