省略特定类型的键

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 是类型 numberb 是 ... 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 时,密钥将被省略。

Playground