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如果我意外使用了一个不是O键的字符串,或者更重要的是如果我将来更改了O的定义(typescript 2.7.1)更新:typescript现在将省略
类型作为其标准库的一部分,这意味着您不必自己声明它。