拾取除指定属性之外的所有属性

时间:2017-12-10 18:07:00

标签: typescript

我们说我有一个界面:

interface Buba {
    k1: string;
    k2: string;
    k3: number;
}

我想基于此定义创建一个新类型,除了指定属性之外的所有属性。例如,我想摆脱k1。这样的事情甚至可能吗?

type PickedBuba = Pick<Buba, !'k1'> // { k2: string, k3: number }

1 个答案:

答案 0 :(得分:3)

我似乎找到了一种方法。我们需要一个帮助器类型 StringOmit

type StringOmit<L1 extends string, L2 extends string> = ({ [P in L1]: P } &
    { [P in L2]: never } & { [key: string]: never })[L1];

然后我们可以编写自己的PickOmit实现

type PickOmit<O, K extends string> = Pick<O, StringOmit<keyof O, K>>;

然后解决方案看起来像这样:

type PickedBuba = PickOmit<Buba, 'k1'> // { k2: string, k3: number }

修改 使用Typescript 2.8,我们可以实现Omit利用条件类型和新的内置类型排除

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;