TypeScript keyof returning specific type

Typescript 4.1 and above

With the addition of the as clause in mapped types we can now simplify the original type to:

type KeyOfType<T, V> = keyof {
    [P in keyof T as T[P] extends V? P: never]: any
}

Playground Link

Original answer

You can use conditional types in Tyepscript 2.8 :

type KeysOfType<T, TProp> = { [P in keyof T]: T[P] extends TProp? P : never }[keyof T];

let onlyStrings: KeysOfType<Foo, string>;
onlyStrings="baz" // error
onlyStrings="bar" // ok

let onlyNumbers: KeysOfType<Foo, number>;
onlyNumbers="baz" // ok
onlyNumbers="bar" // error 

Playground Link

Leave a Comment