Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
2.6k views
in Technique[技术] by (71.8m points)

get `keyof` non-optional property names in typescript

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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...