我想得到类型A的键并将它们写入类型B。
我期望类型B是“x”,但我收到“x|未定义”。
为什么keyof运算符也包含undefined到结果类型?
我知道我可以尝试在Required util中 Package 类型,但我只是想了解keyof是如何工作的,因为在doc中我找不到任何东西。
运动场
type A = {x?: string | null};
type B = {[Key in keyof A]: Key}[keyof A];
我想得到类型A的键并将它们写入类型B。
我期望类型B是“x”,但我收到“x|未定义”。
为什么keyof运算符也包含undefined到结果类型?
我知道我可以尝试在Required util中 Package 类型,但我只是想了解keyof是如何工作的,因为在doc中我找不到任何东西。
运动场
type A = {x?: string | null};
type B = {[Key in keyof A]: Key}[keyof A];
1条答案
按热度按时间rekjcdws1#
{[K in keyof T]: ⋯T[K]⋯}
形式的 * 同态 * Map类型(在What does "homomorphic mapped type" mean?中描述)保留了Map属性的可选和/或readonly
性质。可选属性in,可选属性out:而且可选属性会自动将
undefined
包含在它们的域中,实际上,当您使用IntelliSense将鼠标悬停在该类型上时,通常会在其中看到| undefined
,如上所示。(这假设您使用的是--strictNullChecks
,而不是--exactOptionalPropertyTypes
编译器选项。)因此,当您index into它以获取作为联合的值时,任何可选属性都将为结果联合贡献
undefined
:因此
| undefined
本身并不是来自keyof
,而是来自您Map的类型中的| undefined
。正如你提到的,你可以使用
Required
或-?
Map修饰符来解决这个问题:Playground代码链接