模块 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 次尝试后可用的解决方案