继承时如何从接口中排除属性

时间:2018-06-27 13:24:33

标签: typescript

我有两个界面,XYX具有2个属性,x1x2。现在Y希望从X继承,但不想继承x2

interface X {
  x1 : string;
  x2 : string;
}

interface Y extends X{
  // x2 shouldn't be available here
}

作为TypeScript中的新功能,我无法弄清楚。 extends X without x1中是否有任何TypeScript类型的内置功能?

注意:在我的真实情况下,X是内置的interface。因此,我需要执行此操作而不更改X接口。有可能吗?

2 个答案:

答案 0 :(得分:9)

这可以使用Typescript 2.1和2.8中引入的PickExclude类型来实现:

/**
 * From T pick a set of properties K
 */
type Pick<T, K extends keyof T> = {
    [P in K]: T[P];
};

/**
 * Exclude from T those types that are assignable to U
 */
type Exclude<T, U> = T extends U ? never : T;

使用这些类型定义,您可以构造Omit<T,K>以省略泛型的特定属性:

/**
 * From T pick all properties except the set of properties K
 */
export type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;

要说明Typescript 2.8 Release Notes为什么打字稿中不包含此类型:

  

我们没有包含Omit类型,因为它写得很简单   为Pick<T, Exclude<keyof T, K>>

尽管Typescript中未包含它,但一些库提供了它们自己的相似 Omit类型,包括react-reduxMaterial-UI

Here是一个有效的示例:

interface X {
  x1: string;
  x2: string;
}

type Y = Omit<X, 'x2'>;

let x: X = {
  x1: 'string1',
  x2: 'string2'
}

let y: Y = {
  x1: 'string1'
}

Example of Omit

请注意,将检查要排除的属性,排除指定类型中未定义的属性是错误的:

Example of Omit using non-existent property name

答案 1 :(得分:-2)

interface X {
  x1 : string;
  x2 : string;
}

class Y implements X{
  x1: string;
  get x2():string {
    return "sorry but x2 is not available here";
  }
}