我们说我有一个界面:
interface Buba {
k1: string;
k2: string;
k3: number;
}
我想基于此定义创建一个新类型,除了指定属性之外的所有属性。例如,我想摆脱k1。这样的事情甚至可能吗?
type PickedBuba = Pick<Buba, !'k1'> // { k2: string, k3: number }
答案 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>>;