4

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?

11
  • 1
    A typescript class instance is a javascript object. You see that on the console because that is the way Chrome outputs it: Type object. What exactly are you trying to achieve? Commented Mar 23, 2018 at 19:36
  • It isn't true. When I print typeof === 'object' on my instance, it is false. After the parse, it prints true Commented Mar 23, 2018 at 19:37
  • It is true. If you do a instanceof Object it returns true. typeof "hello" outputs string, not object, and yet is a valid JavaScript object Commented Mar 23, 2018 at 19:39
  • 2
    I want to upload this as a Javascript object, it get's rejected <= What exactly do you mean by "upload as a javascript object" and what do you mean by "rejected"? What does rejected mean? Is there an error message? If so please post it. Commented Mar 23, 2018 at 19:45
  • 1
    Then this is a firebase specific issue. See also this "duplicate" github issue. In the future it helps to have context. Adding what you have above in your comment makes it much easier to understand by those reading through your question. Commented Mar 23, 2018 at 19:49

3 Answers 3

5

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);

Sign up to request clarification or add additional context in comments.

3 Comments

So your answer is to use vanilla JavaScript then? I agree!
@RandyCasburn: Well, this question is not specific to TypeScript in that types are not the issue. (And vanilla JS is executable as snippet, so...)
The OP uses types in his example - and that is the reason it cannot be used directly. But I still agree with you :-)
3

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" }.

Comments

0

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());

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.