关键字 & 内置类型

本文记录 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?