当前位置: 首页 > 知识库问答 >
问题:

从类型中排除属性

龙哲
2023-03-14

我想从类型中排除一个单独的属性。我该怎么做呢?

比如我有

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

我想排除属性 z 以获得

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

共有3个答案

顾亦
2023-03-14

在typescript 2.8中,您可以使用新的内置< code>Exclude类型。2.8发行说明实际上在“预定义的条件类型”一节中提到了这一点:

注意:Exclude类型是此处建议的Diff类型的正确实现。[…]我们没有包括Omit类型,因为它通常写为<code>Pick

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

type XY = Pick<XYZ, Exclude<keyof XYZ, "z">>
邢寒
2023-03-14

省略...

type T1 = Omit<XYZ, "z"> // { x: number; y: number; }
type T2 = Omit<XYZ, "y" | "z"> // { x: number; } 

例如所有字符串类型:

type Keys_StringExcluded<T> = 
  { [K in keyof T]: T[K] extends string ? never : K }[keyof T]

type XYZ = { x: number; y: string; z: number; }
type T3a = Pick<XYZ, Keys_StringExcluded<XYZ>> // { x: number; z: number; }

具有TS 4.1键重新映射/作为映射类型(PR)中的子句的更短版本:

type T3b = { [K in keyof XYZ as XYZ[K] extends string ? never : K]: XYZ[K] } 
// { x: number; z: number; }

例如,排除 getter(带有“get”字符串前缀的道具)

type OmitGet<T> = {[K in keyof T as K extends `get${infer _}` ? never : K]: T[K]}

type XYZ2 = { getA: number; b: string; getC: boolean; }
type T4 = OmitGet<XYZ2> //  { b: string; }

注意:TS 4.1支持上述模板文字类型。您也可以在此处编写get${string}而不是get${infer_}

< code>Pick、< code>Omit和其他实用程序类型

如何使用Typescript选择和重命名某些键?(重命名而不是排除)

操场

锺星腾
2023-03-14

在TypeScript 3.5中,省略类型被添加到标准库中。有关如何使用它,请参阅下面的示例

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

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

您不能在2.8以下的版本中使用排除类型,但您可以为其创建一个替换项,以便使用与上述相同类型的定义。但是,此替换仅适用于字符串类型,因此它不如排除强大。

// 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}
 类似资料:
  • 我们如何排除模型中“groovy”类的元类属性作为响应?我有一个Jax-Rs资源,它返回一个带swagger@ApiModel注释的groovy对象。我在swagger ui中看到了太多时髦的特定属性。如何从序列化中排除它? 它似乎在使用Jackson进行pogo json序列化?如何注释我的groovy类,将元类属性排除在json序列化字符串中?我试着使用JsonIgnoreProperties

  • 问题内容: 我已经创建了下面的对象,该对象将被映射到ElasticSearch类型。我想从索引中排除该属性: 问题答案: 您应该能够设置属性的值,如下所示:

  • 问题内容: 我写了以下函数: 我想向函数添加类型注释: 但是,我想明确定义返回的字典内的值 不能 为None。 有没有办法说“类型,除”或“除”以外的所有可能值? 问题答案: 假设您愿意在调用函数时修复键和值的类型,则可以使用泛型来使其明确。这还可能会允许的情况下是,但它使意图很清楚。请注意,由于存在差异问题,因此必须使用。但是,无论如何这是优选的。 使用此定义,可以正确地将可选类型转换为非可选类

  • 问题内容: 我有以下(完整)实体类。 我仅需要此类中的两个属性作为JSON响应,即和。其余属性必须被JSON处理/序列化时忽略。 我尝试将拦截器设置如下。 完成此操作后,其余属性预计将被忽略,但似乎不起作用。生成了与所有实体类相关联的SQL语句的数量,这又导致发生其他严重错误,例如, 我在这里想念什么?如何忽略除和以外的所有属性? 我正在使用Struts2-json-plugin-2.3.16。

  • 问题内容: 我试图在一些使用ant脚本的旧项目上进行“干净的专家”设置。我对蚂蚁知之甚少,所以我的问题似乎很幼稚。 我快完成了,但是由于classpath中的冗余,所以传递ant脚本失败了。如果我了解构建,则这些行应将“提供”范围内的每个库添加到类路径中: 然后这个: 将那些依赖项添加到ant.home目录中的库中。 麻烦的是,我使用的maven pom依赖于我无法修改的父pom,因此,我的类路径

  • 问题内容: 当我对像这样的索引执行查询时: 响应包括索引,类型等。但是我已经知道了索引和类型,因为我指定了它。此信息只会使json数据的大小膨胀。有没有办法从响应中排除这些? 这是我得到的: 我想要的是这样的,所以没有 类型,分数,索引 的响应: 问题答案: 是的,从ES 1.6开始,您可以使用响应过滤,并且在查询中使用参数仅枚举响应中所需的内容: