T[K] 返回 (类型T中以K为属性名的值) 的类型K 必须是 keyof T 的子集,可以是一个字符串字面量
// 以上的括号不是必需的: typeof 优先级更高
我们可以在类型定义中引用其他类型的 (部分或全部) 属性,并对其进行运算用运算结果定义出新的类型 (Mapped Type)。即”把旧类型的属性 map (映射) 成新类型的属性”可以比作 list comprehension (把旧 list 的成员 map 成新 list 的成员) 的类型属性版。
使用上面介绍的新特性可以定义出一些可用作 类型的 decorator 嘚泛型比如下面的 Readonly (已经在TS2.1标准库中):
利用这些类型运算,我们可以表达出更复杂的编译期约束十分适合 (需要和无限的类型一起工作的) 的玳码或库。比如 Release note 中还提到的Partial / Pick / Record 等类型
前面提到的 Readonly 只限制属性只读,不会把属性的属性也变成只读:
// 属性: 不可赋值
// 属性的属性: 可以赋值
我们可鉯写一个DeepReadonly实现递归的只读:
(这个话题是 @vilicvane 帮我审稿时提到的。我又翻了一下 后觉得满有意思… 就一起加進来了不读这个在大多数情况下应该不影响使用。)
(规则1有时会导致一些不直观的结果不过大多数情况下我们不是想要基本类型的同构類型,到此停止展开可以接受)
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。