TypeScript映射类型是否可识别null/undefined?该行为是否有文档记录?
TypeScript映射类型处理null/undefined/unknown/never的行为说明
这个行为是TypeScript官方明确规定的,并非未文档化的编译器技巧,具体规则分情况说明如下:
1. null与undefined的映射结果
当映射类型的输入是null或undefined时,TypeScript会直接返回原类型。这是因为null和undefined属于非对象类型,映射类型本质是针对对象类型的属性遍历操作,对于这类非对象的特殊原始类型,编译器会直接返回输入类型本身。
代码验证:
type MappedType<T> = {[P in keyof T]: T[P]} type MappedNull = MappedType<null> // null type MappedUndefined = MappedType<undefined> // undefined
2. unknown的映射结果
unknown的映射结果为{},原因是keyof unknown的结果是never,而映射类型遍历空键集合(即never)时,会生成没有任何属性的空对象类型{},这是映射类型的基础规则。
代码验证:
type MappedUnknown = MappedType<unknown> // {}
3. never的映射结果
never作为映射类型输入时直接返回never。这是因为never表示不存在的类型,任何涉及never的类型操作都会直接返回never,符合该类型的收缩规则。
代码验证:
type MappedNever = MappedType<never> // never
补充keyof相关背景规则
keyof null、keyof undefined、keyof unknown均返回never,因为这些类型本身没有可遍历的属性;keyof never返回string | number | symbol,是因为never是所有类型的子类型,从类型理论上会被推断为所有可能键类型的联合。
内容的提问来源于stack exchange,提问作者Drax
相关产品推荐
相关产品推荐

