【问题标题】:How can I convert a TypeScript object to a plain object?如何将 TypeScript 对象转换为普通对象?
【发布时间】:2016-09-14 23:35:32
【问题描述】:

我正在使用一个 JS 库,特别是 select2,如果我传递的对象不是普通对象,它的行为与我想要的略有不同。这都是通过使用 jQuery 的isPlainObject 函数来检查的。

TypeScript 是否有一个我不知道的演员表,不用我自己写就可以实现这一点?

class Opt {
    constructor(public id, public text) {

    }

    toPlainObj(): Object {
        return {
            id: this.id,
            text: this.text
        }
    }
}

let opts = [
    new Opt(0, 'foo'),
    new Opt(1, 'bar')
];

console.clear()

console.log('both should be false')
$.map(opts, opt => {
    console.log($.isPlainObject(opt))
})

console.log('both should be true')
$.map(opts, opt => {
    console.log($.isPlainObject(opt.toPlainObj()))
})

【问题讨论】:

  • 请在此处发布您的代码
  • @messerbill 我不相信 SO 代码 sn-ps 支持 TypeScript。至少,我无法让它工作。
  • 在此处输入即可 - 您无需使用代码 sn-p 功能

标签: javascript typescript


【解决方案1】:

你可以使用Object.assign():

class Point {
    private x: number;
    private y: number;

    constructor(x: number, y: number) {
        this.x = x;
        this.y = y;
    }

    getX(): number {
        return this.x;
    }

    getY(): number {
        return this.y;
    }
}

let p1 = new Point(4, 5);
let p2 = Object.assign({}, p1);

p1 是类实例,p2 只是{ x: 4, y: 5 }

使用toPlainObj 方法:

class Point {
    private x: number;
    private y: number;

    constructor(x: number, y: number) {
        this.x = x;
        this.y = y;
    }

    getX(): number {
        return this.x;
    }

    getY(): number {
        return this.y;
    }

    toPlainObj(): { x: number, y: number } {
        return Object.assign({}, this);
    }
}

如果这是您在更多类中需要的东西,那么您可以拥有一个具有此方法的基类:

class BaseClass<T> {
    toPlainObj(): T {
        return Object.assign({}, this);
    }
}

class Point extends BaseClass<{ x: number, y: number }> {
    private x: number;
    private y: number;

    constructor(x: number, y: number) {
        super();

        this.x = x;
        this.y = y;
    }

    getX(): number {
        return this.x;
    }

    getY(): number {
        return this.y;
    }
}

【讨论】:

  • 太棒了!我正要引爆保险丝,但这个答案救了我:)
  • 我正在寻找完全相反的情况。有普通的 js 对象,想把它转换成特定的类型。
  • @Moulde 类似这样:stackoverflow.com/questions/43314791/… ?
  • 值得一提的是,这不会将任何对象属性转换为 JS 对象,它们将保留为任何类型的实例。请参阅以下示例:typescriptlang.org/play/#code/…
  • @Qyaffer 你知道将对象实例属性转换为普通对象的任何方法吗?
【解决方案2】:

这样的事情很简单,而且很有效:

let plainObj;
try {
    plainObj = JSON.parse(JSON.stringify(obj));
} catch(e) {
    console.error(e)
}

【讨论】:

  • 搞砸了对象中的日期。
【解决方案3】:

我知道这是一篇旧帖子,但是在上面 Nitzan 的回答中,打字稿语法检查器似乎可以执行以下操作:

const plainObj:any = ClassObj;
ClassObj.newProperty = "Test";

所以似乎没有真正需要使用 Object.assign 除非有我不知道的差异。

【讨论】:

    【解决方案4】:

    Lodash 内部函数是无名英雄。默认情况下不导出它们。 _baseClone 可以做到这一点。我在我的 Angular 项目中这样做。

    import * as baseClone from 'lodash/_baseClone'
    
    const classObj = getComplexClassObject();
    const flatObj = baseClone(classObj, 7);
    

    7 因为1 | 2 | 4。分别是深旗、平旗、符号旗。看看吧,_baseClone.js

    【讨论】:

      【解决方案5】:

      你只需要解构对象。像这样:{...myObject}

      【讨论】:

        猜你喜欢
        • 2020-01-25
        • 2016-08-07
        • 2021-06-20
        • 2016-07-13
        • 2016-08-30
        相关资源
        最近更新 更多