从类型中排除属性

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


例如我有


interface XYZ {

  x: number;

  y: number;

  z: number;

}

我想排除财产z以获得


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


慕斯709654
浏览 1161回答 3
3回答

达令说

适用于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 {&nbsp; &nbsp; a: string;&nbsp; &nbsp; b: number;&nbsp; &nbsp; 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}

紫衣仙女

使用打字稿2.8,您可以使用新的内置Exclude类型。在2.8版本说明实际上在节“预定义条件类型”提到这一点:注意:Exclude类型是此处建议的Diff类型的正确实现。[...]我们没有包含Omit类型,因为它的形式很简单Pick<T, Exclude<keyof T, K>>。将此应用于您的示例,XY类型可以定义为:type XY = Pick<XYZ, Exclude<keyof XYZ, "z">>

湖上湖

我找到了声明一些变量并使用传播运算符来推断类型的解决方案:interface XYZ {&nbsp; x: number;&nbsp; y: number;&nbsp; z: number;}declare var { z, ...xy }: XYZ;type XY = typeof xy; // { x: number; y: number; }它有效,但是我很高兴看到更好的解决方案。
打开App,查看更多内容
随时随地看视频慕课网APP