If I have the following type
interface Foo {
bar: string;
baz: number;
qux: string;
}
can I use typeof
to type a parameter such that it only takes keys of Foo
that return string
('bar'
or 'qux'
)?
If I have the following type
interface Foo {
bar: string;
baz: number;
qux: string;
}
can I use typeof
to type a parameter such that it only takes keys of Foo
that return string
('bar'
or 'qux'
)?
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
}
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