Typescript 拾取除指定属性以外的所有属性

Typescript 拾取除指定属性以外的所有属性,typescript,Typescript,假设我有一个界面: interface Buba { k1: string; k2: string; k3: number; } 我想基于此定义创建一个新类型,该类型的所有属性(指定的属性除外)。例如,我想摆脱k1。这样的事情可能吗 type PickedBuba = Pick<Buba, !'k1'> // { k2: string, k3: number } type PickedBuba=Pick/{k2:string,k3:number} 看来我找

假设我有一个界面:

interface Buba {
    k1: string;
    k2: string;
    k3: number;
}
我想基于此定义创建一个新类型,该类型的所有属性(指定的属性除外)。例如,我想摆脱k1。这样的事情可能吗

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

看来我找到了一种方法。我们需要一个助手类型StringOmit

type StringOmit<L1 extends string, L2 extends string> = ({ [P in L1]: P } &
    { [P in L2]: never } & { [key: string]: never })[L1];
type StringOmit=({[P in L1]:P}&
{[P在L2]:never}&{[key:string]:never}[L1];
然后我们可以编写自己的PickOmit实现

type PickOmit<O, K extends string> = Pick<O, StringOmit<keyof O, K>>;
类型PickOmit=Pick;
那么解决方案将如下所示:

type PickedBuba = PickOmit<Buba, 'k1'> // { k2: string, k3: number }
type PickedBuba=PickOmit/{k2:string,k3:number}
编辑 使用Typescript 2.8,我们可以利用条件类型和新的内置类型排除实现省略:

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
类型省略=拾取;

tnks用于此;我使用的是
类型PickOmit=Pick省略
类型作为其标准库的一部分,这意味着您不必自己声明它。