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

kognpnkq  于 2023-03-31  发布在  TypeScript
关注(0)|答案(3)|浏览(321)

假设我有以下代码:

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是否有某种“硬转换”,在类型之间转换时会删除任何不需要的字段。

4si2a6ki

4si2a6ki1#

在TypeScript中没有强制转换,因为这不是TypeScript的工作方式。TS是JS之上的类型层。当你在TS中分配一个类型时,你没有设置类型,你 * 注解 * 给定的表达式是某种类型。当TS代码被编译为JS时,所有类型信息都被剥离。
或者换句话说:类型系统是JS,使用TS你只需要声明一个变量是某个类型。2通常你在设计的时候分配了错误的类型,在调试的时候你会惊讶的发现这个变量的类型和预期的完全不同。
如果你想确保一个属性从一个对象中被移除,你需要使用JS的方式(如果需要的话,用TS注解结果)。检查this Q&A来了解如何从一个对象中移除属性。

xesrikrc

xesrikrc2#

Typescript不会为你做这件事,因为这不是他的工作。

interface A {
    a: number;
}

interface B extends A {
    b: number;
}

const b: B = {a: 1, b: 5};
const a: A = b as A; // you want to remove a.b

使用省略号

const {a, ...otherProperties} = b; // extract the property `a` and keep the other properties in `otherProperties`

或者只删除“a”,但避免删除,这是命令式的,TS不会理解它,处理vm删除的属性也会更慢

delete a.b;

或者使用Lodash,您可以挑选您想要的属性

const a = _.pick(b, ["a"]); // pick only a

或省略仍在使用lodash的属性

const a = _.pick(b, ["b"]); // omit b

示例

ni65a41a

ni65a41a3#

我本来不打算回答,但我选择回答的原因是,我觉得删除原始对象中的数据可能并不总是一个好主意。
相反,我认为最好创建一个新变量,并将数据(不包括不需要的属性)复制到新变量。
在我的情况下,我想把我的注册表转换成登录信息(电子邮件和密码)和其他信息(关于如何找到网站)。
下面的解决方案非常易于使用(在各种情况下),并且易于扩展。

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

相关问题