Reputation: 403
This is my code:
class A{
test: string
constructor(test: string){
this.test = test
}
}
const a = new A("hi")
console.log(a)
This is my output:
A { test: 'hi' }
When I want to upload this as a Javascript object, it get's rejected because it ain't a Javascript object. I can make one by doing this:
const someJSON = JSON.stringify(a)
const javascriptObject = JSON.parse(someJSON)
But I think there must be a better way, this feels like a hack. How to convert a typescript class instance to a plain javascript object?
Upvotes: 4
Views: 4240
Reputation: 184526
If you want a plain JS object instead of a class instance you can spread the properties for example:
class A{
constructor(test){
this.test = test
}
}
const a = new A("hi");
const b = { ...a };
console.log('a:', a);
console.log('b:', b);
console.log('Is b instance of A:', b instanceof A);
Upvotes: 5
Reputation: 7916
You can use Object.setPrototypeOf()
to set the prototype of your symbol explicitly to the default prototype of objects, which is Object.prototype
:
class A {
constructor(test) {
this.test = test
}
}
const a = new A("hi")
Object.setPrototypeOf(a, Object.prototype);
console.log({ a, proto: Object.getPrototypeOf(a) });
This will make a
equal to { test: "hi" }
.
Upvotes: 3
Reputation: 1467
You may need to add methods to your class in future, some properties may become private. So add a method toObject. Then you will be able to use methods and provide data to api in needed format.
class A{
constructor(private _test: string){
}
public toObject(){
//return JSON.parse(JSON.stringify(this));
//in case if you want to have underscored private
let object = {};
Object.keys(this).map((key: string) => {
object[key.slice(1)] = this[key];
});
return object;
}
}
const a = new A("hi")
console.log(a);
console.log('----------------------');
console.log(a.toObject());
Upvotes: 0