省略特定类型的键
Omitting keys of a particular type
这是我想要的:
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
我得到的最接近的是
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
是类型 number
而 b
是 ... never
.
关闭但没有雪茄。
建议 仅在基本类型为 fixed 时有效,奇怪的是,这对我原来的问题有效,但如果类型是通用的,Typescript 会不明白 t[k]
是一个数字。
这应该可以解决问题:
type NumberOnly<T> = {
[K in keyof T as T[K] extends number ? K : never]: T[K]
}
我们在索引签名中使用 as
运算符。当 T[K]
不是 number
时,密钥将被省略。
这是我想要的:
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
我得到的最接近的是
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
是类型 number
而 b
是 ... never
.
关闭但没有雪茄。
建议 t[k]
是一个数字。
这应该可以解决问题:
type NumberOnly<T> = {
[K in keyof T as T[K] extends number ? K : never]: T[K]
}
我们在索引签名中使用 as
运算符。当 T[K]
不是 number
时,密钥将被省略。