在typescript中获取`keyof`非可选属性名称

时间:2018-06-13 05:45:00

标签: typescript

这是我的界面

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。

2 个答案:

答案 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 }类型的参数中,并且检查将无法通过。