如何将TypeScript对象转换为普通对象?

时间:2016-05-18 12:57:47

标签: javascript typescript

我正在使用一个JS库,特别是index,它的行为方式与我不同,如果我传递的对象不是普通对象。这都是使用jQuery的select2函数检查的。

TypeScript是否有一个演员我不知道如果不想写自己的话会实现这个目标?

isPlainObject

4 个答案:

答案 0 :(得分:15)

您可以使用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;
    }
}

答案 1 :(得分:0)

类似这样的事情很简单并且有效:

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

答案 2 :(得分:0)

我知道这是一篇旧文章,但是在Nitzan的上述回答中,只需执行以下操作,打字稿语法检查器就可以了:

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

因此,除非确实没有区别,否则似乎并不需要使用Object.assign。

答案 3 :(得分:0)

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

import * as baseClone from 'lodash/_baseClone'

const classObj = getComplexClassObject();
const flatObj = baseClone(classObj, 7);

7 因为1 | 2 | 4。分别为 Deep Flag、Flat Flag、Symbols Flag。看看吧,_baseClone.js