这是我的界面
interface X {
key: string
value: number | undefined
default?: number
}
但我只想要非可选键,也就是说。 "key" | "value"
,或仅"key"
(两者都可以为我做好)
type KeyOfX = keyof X
给了我"key" | "value" | "default"
。
type NonOptionalX = {
[P in keyof X]-?: X[P]
}
type NonOptionalKeyOfX = keyof NonOptionalX
为"key" | "value" | "default"
提供-?
只会移除可选修饰符,并使所有修饰符都不可选。
PS。我使用Typescript 2.9。
答案 0 :(得分:6)
您可以使用undefined extends k ? never : k
形式的条件类型运算符替换never
代替undefined
可以赋值的值,然后使用union {{1}这一事实对于任何类型都只是T | never
:
T
此评论也可能相关:https://github.com/Microsoft/TypeScript/issues/12215#issuecomment-307871458
答案 1 :(得分:1)
但是我只想要非可选键。 “钥匙” | “值”或“键”(对我都很好)
虽然涵盖了"key"
的更简单选项,但我想介绍一个不太明显的"key" | "value"
选项。因为value
不是可选字段,所以可能需要这样做。可以为它分配undefined
,但是应该通过"value" in x
检查。
type NonOptionalKeys<T> = { [K in keyof T]-?: T extends { [K1 in K]: any } ? K : never}[keyof T]
已更改的条件检查原始类型是否具有与K
相同的名称和“必需”级别的字段,但是由于此映射对象类型中的后缀为-?
,因此始终需要该字段。因此,对于所有可选字段,原始类型将无法放入{ [K1 in K]: any }
类型的参数中,并且检查将无法通过。