Typescript keyof结果包含';未定义';在从具有可选关键帧的对象映射的对象上使用时
这怎么可能?AFAIKTypescript keyof结果包含';未定义';在从具有可选关键帧的对象映射的对象上使用时,typescript,Typescript,这怎么可能?AFAIK未定义不能用作对象键。而且fooptionalNumber不包含这样的键。它是从哪里来的?TS是否在某些条件下向对象添加未定义的 type PickByValue<T, ValueType> = Pick<T, { [Key in keyof T]: T[Key] extends ValueType ? Key : never; }[keyof T]>; interface Foo { user: string age?:
未定义
不能用作对象键。而且fooptionalNumber
不包含这样的键。它是从哪里来的?TS是否在某些条件下向对象添加未定义的
type PickByValue<T, ValueType> = Pick<T, {
[Key in keyof T]: T[Key] extends ValueType ? Key : never;
}[keyof T]>;
interface Foo {
user: string
age?: number
score?: number
}
//'user' | 'age' | 'score' - as expected
type FooKeys = keyof Foo
// as exptected
// {
// age?: number | undefined
// score?: number | undefined
// }
type FooOptionalNumber = PickByValue<Foo, number | undefined>
// 'age' | 'score' | undefined - Where did the 'undefined' come from??
type FooOptionalNumberKeys = keyof FooOptionalNumber
type PickByValue=Pick;
接口Foo{
用户:字符串
年龄:多少
分数?:数字
}
//“用户”|“年龄”|“分数”-如预期
类型FooKeys=keyof Foo
//被排除
// {
//年龄?:数字|未定义
//分数?:数字|未定义
// }
键入fooptionalNumber=PickByValue
//“年龄”|“分数”|未定义-未定义的“分数”来自哪里??
键入fooooptionalnumberkeys=fooooptionalnumber的键
打字脚本专家的答案是。
这个定义
type PickByValue<T, ValueType> = Pick<T, {
[Key in keyof T]: T[Key] extends ValueType ? Key : never;
}[keyof T]>;
所以这个表达式{[Key-in-keyof-T]:T[Key]扩展了ValueType?Key:never;}
使得不扩展ValueType
的可选值成为未定义的,而不是从不
。因此,作为第二个参数,我们传递给Pick
的并集包含undefined
-Pick
。将keyof
应用于此类型只会拉出提供的键“foo”|未定义的
——尽管这是一个非法类型开始。Typescript专家的答案是。
这个定义
type PickByValue<T, ValueType> = Pick<T, {
[Key in keyof T]: T[Key] extends ValueType ? Key : never;
}[keyof T]>;
所以这个表达式{[Key-in-keyof-T]:T[Key]扩展了ValueType?Key:never;}
使得不扩展ValueType
的可选值成为未定义的,而不是从不
。因此,作为第二个参数,我们传递给Pick
的并集包含undefined
-Pick
。将keyof
应用于此类型只会拉出提供的密钥“foo”| undefined
——尽管这是一个非法的类型。“undefined”从何而来???->?
在年龄或分数中。我看不到undefined。也许你的ide有问题。@yantrab你访问过我的TS游乐场链接吗?我在那里和我的生活中都遇到了这个问题vscode@Caramiriel如果?
将未定义的
添加到keyof
结果,那么为什么在keyof Foo
?对象文本可以像let o={undefined:42}
那样编写,但仅因为未定义的字符串键被强制为“未定义”字符串键。您的案例实际上似乎有问题-据我所知,不可能有TS使用fooptionalNumberKeys
类型报告的未定义
(非字符串)类型的键。在操场上,人们甚至可以书写type T1=Pick
,而type T2=Pick
则会正确地发出错误。我可以想象typefooooptionalnumber=PickByValue
要编译,因为类型解析在某种程度上被延迟了。“未定义的”从哪里来???->?
在age
或score
中。我看不到未定义的。也许你的ide有问题。@yantrab你访问过我的TS游乐场链接吗?我在那里和我的生活中都遇到了这个问题vscode@Caramiriel如果?
向keyof
结果添加undefined
,那么为什么在keyof Foo
中没有undefined
?可以像let o={undefined:42}
那样编写对象文本,但这只是因为undefined被强制为“undefined”字符串键。您的案例实际上似乎有问题-据我所知,不可能有TS使用fooptionalNumberKeys
类型报告的未定义
(非字符串)类型的键。在操场上,人们甚至可以书写type T1=Pick
,而type T2=Pick
则会正确地发出错误。我可以想象编译typefooptionalnumber=PickByValue
,因为类型解析在某种程度上被延迟了。如果我理解正确,@vatosarmat通过从映射类型中删除可选性(使用-?
)修复了此问题。它看起来像PickByValue
来自。如果我理解正确,@vatosarmat通过从映射类型中删除可选性(使用-?
)修复了此问题。