NoKey
NoKey

Reputation: 403

Typescript class instance to javascript object

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

Answers (3)

brunnerh
brunnerh

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

JJWesterkamp
JJWesterkamp

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

Vayrex
Vayrex

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

Related Questions