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
需要额外定义。