如何将对象转换为另一种类型并删除TypeScript中不需要的字段?

时间:2018-05-16 19:28:37

标签: typescript

假设我有以下代码:

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是否有某种"硬性演员"这将在类型之间进行转换时删除任何不需要的字段。

2 个答案:

答案 0 :(得分:2)

TypeScript中没有强制转换,因为这不是TypeScript的工作方式。 TS是JS之上的类型层。在TS中指定类型时,如果不设置类型,则注释表示给定表达式属于某种类型。当TS代码被转换为JS时,所有类型信息都被剥离。

或者换句话说:类型系统是JS,使用TS,您只需宣布变量属于某种类型。通常情况下,您在设计时分配错误的类型并在调试期间感到惊讶,因为变量的类型与预期完全不同。

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

答案 1 :(得分:0)

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

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

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

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

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];
    });
  }
}