Typescript keyof结果包含';未定义';在从具有可选关键帧的对象映射的对象上使用时

Typescript 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?:

这怎么可能?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?: 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通过从映射类型中删除可选性(使用
-?
)修复了此问题。