Here is what I would like:
const a = getNumber({a: 3, b: "three"}, "a"); // a is type of number (or even 3)
const b = getNumber({a: 3, b: "three"}, "b"); // does not compile
The closest I have gotten is
type NumberOnly<T> = {
[k in keyof T]: T[k] extends number ? number : never;
}
const getNumber = <T extends Record<string, any>,
K extends keyof NumberOnly<T>>(t: T, k: K):NumberOnly<T>[K]
=> t[k];
a
is type number
and b
is ... never
.
Close but no cigar.
CodePudding user response:
This should fix the problem:
type NumberOnly<T> = {
[K in keyof T as T[K] extends number ? K : never]: T[K]
}
We use the as
operator inside the index signature. When T[K]
is not number
the key will be omitted.