在typescript中获取`keyof`非可选属性名
这是我的界面在typescript中获取`keyof`非可选属性名,typescript,Typescript,这是我的界面 interface X { key: string value: number | undefined default?: number } 但我只想要非可选的钥匙,又名“键”|“值”,或仅是“键”(两者对我都可以) type KeyOfX=KeyOfX为我提供了“key”|“value”|“default” 键入NonOptionalKeyOfX=keyof NonOptionalX将的“key”|“value”|“default”设置为-?仅删除可选修
interface X {
key: string
value: number | undefined
default?: number
}
但我只想要非可选的钥匙,又名<代码>“键”|“值”,或仅是“键”
(两者对我都可以)
type KeyOfX=KeyOfX
为我提供了“key”|“value”|“default”
键入NonOptionalKeyOfX=keyof NonOptionalX
将的“key”|“value”|“default”
设置为-?
仅删除可选修饰符,并使所有修饰符成为非可选修饰符
另外,我使用Typescript 2.9 您可以使用形式为
未定义扩展名k?never:k
用never
替换未定义的
值的键,然后使用unionT | never
对于任何类型都是T
:
interface X {
key: string
value: number | undefined
default?: number
}
type NonOptionalKeys<T> = { [k in keyof T]-?: undefined extends T[k] ? never : k }[keyof T];
type Z = NonOptionalKeys<X>; // just 'key'
接口X{
关键字:字符串
值:数字|未定义
默认值?:数字
}
键入NonOptionalKeys={[k in keyof T]-?:未定义的扩展T[k]?从不:k}[keyof T];
类型Z=非可选键;//只是“钥匙”
此外,该评论可能与以下内容相关:
但我只想要非可选的钥匙,又名。“key”|“value”或仅仅是“key”(两者都适合我)
虽然介绍了“key”
的更简单选项,但我想介绍一个不太明显的选项“key”|“value”
。可能需要它,因为value
不是可选字段。它可以被指定为未定义的
,但它应该在x检查中传递一个“值”
type NonOptionalKeys<T> = { [K in keyof T]-?: T extends { [K1 in K]: any } ? K : never}[keyof T]
type NonOptionalKeys={[K in keyof T]-?:T扩展了{[K1 in K]:any}?K:never}[keyof T]
工作原理:
- 映射对象类型(
K
)中的键实际上不仅是类型,而且是附加了“requiredness”和“ReadOnlines”的类型李>
- 使用
-?
对T
的键进行迭代,在将其放入K
之前,需要使用可选键李>
{[K中的K1]:任何}
对象都是具有单个必需键的对象
- 如果原始类型扩展了它,则该键是必需的,我们将其名称保留为该键的值类型李>
- 可选密钥未通过检查,将被收集为
永不
李>
- 结果对象包含原始类型的键的名称作为字段,相同的键或
从不作为值李>
- 使用
[keyof T]
计算所有值类型的并集,删除从不
类型((a |从不)=a
),只剩下所有所需键的并集
这种过滤器的唯一缺点是,当使用keyof T
获取所有对象键时,编译器错误显示键字符串。但是错误仍然很清楚:类型“foo”不可分配给类型“NonOptionalKeys”
type NonOptionalKeys<T> = { [K in keyof T]-?: T extends { [K1 in K]: any } ? K : never}[keyof T]