【问题标题】:TypeScript Cast object to another object, still has properties from original typeTypeScript 将对象转换为另一个对象,仍然具有原始类型的属性
【发布时间】:2018-11-06 00:07:45
【问题描述】:

问题

我在使用 TypeScript 转换时遇到问题。我收到了一个B 类型的对象,并且我试图将该对象转换为A 类型,但也不要让B 类型的属性随路而行。

问题

有没有办法在不明确引用otherName 属性的情况下做到这一点?这显然是我实际所处情况的精简版。

export class A {
  id: 0;
  name: '';
}

export class B extends A {
  otherName: '';
}

例如:

如果我从类似的东西开始

const b = new B();
const a1 = <A> b;
const a2 = b as A;
console.log(b, a1, a2);

结果:

{id: 0, name: '', otherName: ''}, {id: 0, name: '', otherName: ''}, {id: 0, name: '', otherName: ''}

我希望有类似的东西:

{id: 0, name: '', otherName: ''}, {id: 0, name: ''}, {id: 0, name: ''}

【问题讨论】:

    标签: typescript casting properties


    【解决方案1】:

    TypeScript 类型系统不影响实际的 JavaScript。

    将其视为帮助您更好地了解手头内容的提示或工具。

    如果您想从对象中删除属性,请考虑使用 lodashramda 等实用程序。

    【讨论】:

    • Object.assign()
    • 我知道 TypeScript 的用途。我正在寻找能够简明扼要地为我提供一个仅符合我要转换的接口/类的对象的东西。我不清楚 lodash 和 ramda 如何在这里帮助我,但也许您愿意与您正在考虑的这些库中的特定成员交谈?
    【解决方案2】:

    使用 lodash 包,我们有一个名为“pick”的函数,它可以让我们选择我们想要获取的字段。例如

    _.pick(object, ["firstField", "secondField"])

    这是一个完整的例子:

    import _ from "lodash";
    
    type TestType = {
            name: string;
            surname: string;
        };
    
    const test: TestType = { name: "n", surname: "s" };
    _.pick(test, "name"); // results { name: 'n' }
    

    【讨论】:

    • 请考虑添加一些有关您的代码和发现的信息。
    • @Dennis 很抱歉第一次发布一些东西,我会尝试在其中添加一些信息
    猜你喜欢
    • 2013-01-12
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2019-04-03
    • 2015-12-19
    • 1970-01-01
    相关资源
    最近更新 更多