【问题标题】:How to cast object to another type and remove unneeded fields in TypeScript?如何将对象转换为另一种类型并删除 TypeScript 中不需要的字段?
【发布时间】:2018-10-26 23:08:49
【问题描述】:

假设我有以下代码:

interface A {
    a: number;
}

interface B extends A {
    b: number;
}

const b: B = {a: 1, b: 5};
const a: A = b as A;

现在变量a 的类型为A,但其中仍包含b。有时这是不可取的——我想确定,如果我有一个A 类型的变量,它具有A 类型的确切字段。我想知道,TypeScript 是否有某种“硬转换”,可以在类型之间转换时删除任何不需要的字段。

【问题讨论】:

  • TypeScript 不进行 any 转换或转换。而且它是结构化类型的,所以 “这东西不是 X,因为它有额外的字段” 并没有什么意义。

标签: typescript


【解决方案1】:

我原本不打算回答,但我之所以选择回答是因为我觉得删除原始对象中的数据可能并不总是一个好主意。

相反,我认为最好创建一个新变量并将数据(没有不需要的属性)复制到新变量中。

我的情况是,我想将我的注册表单转换为登录信息(电子邮件和密码)和其他信息(关于如何找到网站)。

以下解决方案相当容易使用(在各种情况下)并且易于扩展。

export class HowFoundWas {
  howFoundWas: foundWasMedia;
  referrerdBy?: string;
  otherSocialMedia?: string;
  referredBySocialMedia?: string;
  otherMedia?: string;

  constructor(howFoundWas: any) {
    [
      "howFoundWas",
      "referrerdBy",
      "otherSocialMedia",
      "referredBySocialMedia",
      "otherMedia",
    ].forEach((prop) => {
      this[prop] = howFoundWas[prop];
    });
  }
}

【讨论】:

    【解决方案2】:

    TypeScript 中没有强制转换,因为 TypeScript 不是这样工作的。 TS 是 JS 之上的类型层。当您在 TS 中分配类型时,您没有设置类型,您注释给定的表达式是某种类型。当 TS 代码转译为 JS 时,所有类型信息都会被剥离。

    或者换句话说:类型系统是 JS,使用 TS 你只是宣布一个变量是某种类型。在设计时分配错误类型并在调试过程中惊讶于变量的类型与预期完全不同的情况往往会发生。

    如果您想确保从对象中删除某个属性,则需要采用 JS 方式(并且 - 如有必要 - 使用 TS 注释结果)。检查this Q&A 以了解如何从对象中删除属性。

    【讨论】:

      猜你喜欢
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      相关资源
      最近更新 更多