从类型中排除属性

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

例如我有

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

我想排除财产z以获得

type XY = { x: number, y: number };
小卤蛋2020/06/02 09:48:44

我喜欢这样:

interface XYZ {
  x: number;
  y: number;
  z: number;
}
const a:XYZ = {x:1, y:2, z:3};
const { x, y, ...last } = a;
const { z, ...firstTwo} = a;
console.log(firstTwo, last);
若合2020/06/02 09:48:43

我找到了声明一些变量并使用传播运算符来推断类型的解决方案

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

declare var { z, ...xy }: XYZ;

type XY = typeof xy; // { x: number; y: number; }

它有效,但是我很高兴看到更好的解决方案。

卡卡西2020/06/02 09:48:43

TypeScript3.5+中

interface TypographyProps {
    variant: string
    fontSize: number
}

type TypographyPropsMinusVariant = Omit<TypographyProps, "variant">
番长2020/06/02 09:48:43

TypeScript3.5

从Typescript 3.5开始,将包括省略帮助器TypeScript 3.5 RC-省略帮助器类型

您可以直接使用它,并且在更新时应该删除自己的Omit助手定义。

若合2020/06/02 09:48:43

适用于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}
Elena2020/06/02 09:48:43

使用 TypeScript2.8,您可以使用新的内置Exclude类型。2.8版本说明实际上在节“预定义条件类型”提到这一点:

注意:Exclude类型是此处建议的Diff类型的正确实现。[...]我们没有包含Omit类型,因为它的形式很简单Pick<T, Exclude<keyof T, K>>

将此应用于您的示例,XY类型可以定义为:

type XY = Pick<XYZ, Exclude<keyof XYZ, "z">>
小次郎2020/06/02 09:48:43

如果您更喜欢使用库,请使用ts-essentials

import { Omit } from "ts-essentials";

type ComplexObject = {
  simple: number;
  nested: {
    a: string;
    array: [{ bar: number }];
  };
};

type SimplifiedComplexObject = Omit<ComplexObject, "nested">;

// Result:
// {
//  simple: number
// }

// if you want to Omit multiple properties just use union type:
type SimplifiedComplexObject = Omit<ComplexObject, "nested" | "simple">;

// Result:
// { } (empty type)

PS:您会在那里找到许多其他有用的东西;)