javascript 对象类型的Typescript keyof运算符

prdp8dxp  于 2023-03-21  发布在  Java
关注(0)|答案(1)|浏览(144)

我想得到类型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];
rekjcdws

rekjcdws1#

{[K in keyof T]: ⋯T[K]⋯}形式的 * 同态 * Map类型(在What does "homomorphic mapped type" mean?中描述)保留了Map属性的可选和/或readonly性质。可选属性in,可选属性out:

type A = { x?: string | null };
//   ^? { x?: string | null | undefined }

type B0 = { [Key in keyof A]: Key };
//   ^? { x?: "x" | undefined }

而且可选属性会自动将undefined包含在它们的域中,实际上,当您使用IntelliSense将鼠标悬停在该类型上时,通常会在其中看到| undefined,如上所示。(这假设您使用的是--strictNullChecks,而不是--exactOptionalPropertyTypes编译器选项。)
因此,当您index into它以获取作为联合的值时,任何可选属性都将为结果联合贡献undefined

type B = B0[keyof A];
//   ^? "x" | undefined

因此| undefined本身并不是来自keyof,而是来自您Map的类型中的| undefined
正如你提到的,你可以使用Required-?Map修饰符来解决这个问题:

type B = { [K in keyof A]-?: K }[keyof A];
// type B = "x"

Playground代码链接

相关问题