






















| |
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 需要额外定义。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。