为了账号安全,请及时绑定邮箱和手机立即绑定

从类型中排除属性

从类型中排除属性

慕斯709654 2019-10-17 10:35:05
我想从类型中排除单个属性。我怎样才能做到这一点?例如我有interface XYZ {  x: number;  y: number;  z: number;}我想排除财产z以获得type XY = { x: number, y: number };
查看完整描述

3 回答

?
达令说

TA贡献1821条经验 获得超6个赞

适用于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}


查看完整回答
反对 回复 2019-10-17
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

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


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


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


type XY = Pick<XYZ, Exclude<keyof XYZ, "z">>


查看完整回答
反对 回复 2019-10-17
?
湖上湖

TA贡献2003条经验 获得超2个赞

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


interface XYZ {

  x: number;

  y: number;

  z: number;

}


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


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

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


查看完整回答
反对 回复 2019-10-17
  • 3 回答
  • 0 关注
  • 1160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信