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?
    – Oscar Paz
    CommentedMar 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
    – NoKey
    CommentedMar 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
    – Oscar Paz
    CommentedMar 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.
    – Igor
    CommentedMar 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.
    – Igor
    CommentedMar 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);

3
  • So your answer is to use vanilla JavaScript then? I agree!CommentedMar 23, 2018 at 19:42
  • @RandyCasburn: Well, this question is not specific to TypeScript in that types are not the issue. (And vanilla JS is executable as snippet, so...)
    – brunnerh
    CommentedMar 23, 2018 at 19:45
  • The OP uses types in his example - and that is the reason it cannot be used directly. But I still agree with you :-)CommentedMar 23, 2018 at 19:48
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" }.

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

      Start asking to get answers

      Find the answer to your question by asking.

      Ask question

      Explore related questions

      See similar questions with these tags.