小编典典

从类型中排除属性

all

我想从类型中排除一个属性。我怎样才能做到这一点?

例如我有

interface XYZ {
  x: number;
  y: number;
  z: number;
}

我想排除财产z来获得

type XY = { x: number, y: number };

阅读 78

收藏
2022-04-14

共1个答案

小编典典

对于 3.5 或更高版本的 TypeScript

在 TypeScript 3.5
中,该Omit类型被添加到标准库中。请参阅下面的示例以了解如何使用它。

对于低于 3.5 的 TypeScript 版本

在 TypeScript 2.8 中,该Exclude类型被添加到标准库中,允许省略类型简单地编写为:

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

对于低于 2.8 的 TypeScript 版本

您不能Exclude在 2.8
以下的版本中使用该类型,但您可以为它创建一个替换,以便使用与上述相同的定义。但是,这种替换只适用于字符串类型,因此不如Exclude.

// Functionally the same as Exclude, but for strings only.
type Diff<T extends string, U extends string> = ({[P in T]: P } & {[P in U]: never } & { [x: string]: never })[T]
type Omit<T, K extends keyof T> = Pick<T, Diff<keyof T, K>>

以及使用该类型的示例:

interface Test {
    a: string;
    b: number;
    c: boolean;
}

// Omit a single property:
type OmitA = Omit<Test, "a">; // Equivalent to: {b: number, c: boolean}

// Or, to omit multiple properties:
type OmitAB = Omit<Test, "a"|"b">; // Equivalent to: {c: boolean}
2022-04-14