我正在使用一个JS库,特别是index
,它的行为方式与我不同,如果我传递的对象不是普通对象。这都是使用jQuery的select2
函数检查的。
TypeScript是否有一个演员我不知道如果不想写自己的话会实现这个目标?
isPlainObject
答案 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。