typescript 注解解读1
Published:
·
LastMod: August 20, 2024
·
613 words
源注解代码 🔗
| |
解读 🔗
- 索引签名和可选性:
readonly [K in keyof Defaults as ...] -?:readonly: 表示生成的属性是只读的。[K in keyof Defaults]: 定义了一个索引签名,遍历Defaults的所有键。as ...: 这里是一个类型条件,用来过滤键。-?: 可以移除或保留属性的可选项标记 (?)。在这个场景中,由于-?在条件之后,所以它不会立即应用。
- 类型条件:
K extends keyof T ? K : never: 这个条件确保只有那些同时存在于T和Defaults中的键才会被包含进来。
- 内部类型条件:
K extends keyof T ? ... : never: 再次确认K是T的键。Defaults[K] extends undefined ? ... : NotUndefined<T[K]>: 检查Defaults[K]是否为undefined。- 如果是
undefined:- 使用
IfAny<Defaults[K], NotUndefined<T[K]>, T[K]>。这里IfAny是一个自定义类型,用于处理当Defaults[K]为任何类型时的情况。如果Defaults[K]为任意类型(即any),则结果类型是NotUndefined<T[K]>;否则,结果类型是T[K]。
- 使用
- 如果不是
undefined:- 直接使用
NotUndefined<T[K]>,即去除T[K]的undefined值。
- 直接使用
- 如果是
- 辅助类型:
IfAny<T, U, V>: 当T是any时选择U类型,否则选择V类型。NotUndefined<T>: 去除类型T中的undefined。
总结 🔗
最终生成的类型会根据 Defaults 中的值来决定 T 的属性类型:
- 如果
Defaults[K]是undefined,那么T[K]的类型会保持不变(除非T[K]本身就是undefined,此时它会被替换为非undefined的类型)。 - 如果
Defaults[K]不是undefined,那么T[K]的类型将被限制为非undefined。
注意:这里的 IfAny 和 NotUndefined 需要额外定义。