Issue
This is my interface
interface X {
key: string
value: number | undefined
default?: number
}
But I want the non-optional keys only, aka. "key" | "value", or just "key" (both will do fine for me)
type KeyOfX = keyof X gives me "key" | "value" | "default".
type NonOptionalX = {
[P in keyof X]-?: X[P]
}
type NonOptionalKeyOfX = keyof NonOptionalX gives "key" | "value" | "default" as -? only removes the optional modifier and make all of them non-optional.
ps. I use Typescript 2.9.
Solution
You can use conditional type operator of the form undefined extends k ? never : k to substitute never for keys of values that undefined could be assigned to, and then use the fact that union T | never is just T for any type:
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'
Also this comment might be relevant: https://github.com/Microsoft/TypeScript/issues/12215#issuecomment-307871458
Answered By - artem
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.