跳转到主要内容
模块 6 · 第 2 课(共 2)课程中的12/14~15 min
模块课程(2/2)

映射类型

映射类型允许您通过一一转换现有类型的属性来创建新类型。它们使用 keyof 运算符构建在键的循环语法之上。

TS
type Mapped<T> = {
  [P in keyof T]: T[P];
};

此示例显示了与原始类型相同的映射类型:它迭代 keyof T 中的每个键 P 并分配相同的类型 T[P]。


可变性和选择性修饰符

我们可以通过在修饰符前加上 + (添加,默认)或 - (删除)来添加或删除诸如 readonly 和 ? (可选)之类的修饰符。

例如,要从类型的所有属性中删除可选性(使它们成为必需的):

TS
type Concrete<T> = {
  [P in keyof T]-?: T[P];
};

-? 修饰符从每个属性中删除可选标志。


使用 as 重新映射键

在 TypeScript 4.1+ 中,您可以使用 as 子句和模板文字类型重新映射映射类型中的键。

TS
type WriteSetters<T> = {
  [K in keyof T as `set${Capitalize<string & K>}`]: (value: T[K]) => void;
};

在这里,我们将每个属性的名称 K 更改为 set[CapitalizedKey] 并将其类型修改为 setter 函数。


自己尝试一下

练习 1:使属性可为空

锻炼#ts.m6.l2.e1
尝试:0加载中...

声明一个通用映射类型 Nullable<T>,它接受对象 T 并转换每个属性,以便它也可以接受值 null(例如 T[K] | null)。

正在加载编辑器...
显示提示

使用语法 [K in keyof T]:T[K] |无效的;在映射类型对象内部。

3 次尝试后可用的解决方案

练习 2:使用 as 生成动态 Getter

锻炼#ts.m6.l2.e2
尝试:0加载中...

创建一个名为 GetterNames<T> 的映射类型,通过在对象 T 的键前面添加“get”前缀并将原始键大写(使用 Capitalize)来转换对象 T 的键。例如,如果某个键是 name,则它应该变为 getName。将属性的类型设置为 () => T[K]。

正在加载编辑器...
显示提示

使用 as \`get\${Capitalize<string & K>}\` 重新映射键,并使用 () => T[K] 作为属性返回类型。

3 次尝试后可用的解决方案