关键字 & 内置类型
本文记录 TS 一些工具类型的实现 源码约在 typescript/lib/lib.es5.d.ts 1468 行处开始
在阅读这些工具类型的实现时 需要先了解一些 TS 中的关键字
关键字
keyof
keyof 与 Object.keys 相似 不过 keyof 是用来获取对象类型的键的
举个 🌰
interface Person {
age: number;
name: string;
}
type Player = {
age: number;
name: string;
};
type PersonKeys = keyof Person; // --> "age" | "name"
type PlayerKey = keyof Player; // --> "age" | "name"
typeof
typeof 用来返回一个值的 type
举个 🌰
例如 当我们想把多个工具合成一个的时候 就可以用typeof帮我们减少重复定义
extends
extends 用来继承
注意 只有 interface 和 class 才可以继承
type 关键字声明的类型别名无法继承
举个 🌰
in
in 关键字可以帮助我们生成映射类型
举个 🌰
is
is 用作类型保护
举个 🌰
这样来看 似乎两者没有差别 都能正确判断 string 类型
但是如果场景复杂一点 如下
isString1 判断后的结果会返回一个 string 的保护类型

而 isString2 因为 params 是 any 会绕过 ts 的检查
所以就算调用了一个 string 类型上不存在的属性 也不会在编码阶段有任何问题 只有在运行时候才会报错
infer
infer 可以帮助我们推断出函数的返回值
举个例子
好了 了解这些关键字后 就可以去看 TS 内置的工具类型的实现了
工具类型
Partial
让 T 中所有属性都变成可选
先用 keyof 遍历 T 中所有属性
然后 用 in 生成映射类型
Required
-? 表示移除所有可选的属性
Readonly
Pick
从 T 中筛选属性为 K 的集合
举个 🌰
Record
它用来生成一个属性为 K,类型为 T 的类型集合
举个 🌰
如果 K 中是类型 不是值 则会生成对应类型的索引签名 但只能是 string | number | symbol
举个 🌰
Exclude
Extract
上述两个类型 刚好相反 实现的原理也很简单
举个 🌰 吧
Omit
构建一个新类型 T 排除 T 中的 K 属性
如果 T 为值 则排除对应的属性名
如果 T 为类型 则排除对应类型的属性
举个 🌰
NonNullable
约束类型不能为 null 和 undefined
Parameters
获取一个函数的参数类型,返回的是一组包含类型的数组
举个 🌰
ConstructorParameters
获取构造函数中的参数类型
举个 🌰
ReturnType
获取函数的返回值
举个 🌰

这时 我们就可以使用 ReturnType

InstanceType
获取类的实例类型 和用类直接去约束类型一样
举个 🌰
此外还有一些限制 string 形式的工具类型
Uppercase 约束 小写
Lowercase 约束 大写
Capitalize 约束 首字母大写
Uncapitalize 约束 首字母小写
举个 🌰
Last updated
Was this helpful?