Javascript对象和Typescript对象之间的区别

时间:2019-01-04 19:05:03

标签: typescript

我试图确定Typescript对象是否与Javascript对象相同。我有一个typescript变量,我想将JSON.parse的结果转换成类型,我想从javascript创建一个object json,但是我无法做它。

我有以下两个课程

export class User {
  constructor (public firstname:string,
               public lastname:string,
               public email:string,
               public password:string=""){} 
}

export class UserProfileAPI {
  'external-profile': User;
  constructor(externalProfile:User){ 
    this['external-profile'] = externalProfile;
  }
}

我已经创建了一个规范来测试明确创建的objectjson.parse创建的对象是否相同或相似,但是似乎并不相同。

 fit('should test if Typescript object is same as Javascript object',()=>{
    let user = new User('manu','chadha','test@test.com');
    let dummyUserProfile:UserProfileAPI= new UserProfileAPI(user);
    console.log('dummy profile is ',dummyUserProfile);
    let dummyProfile2:UserProfileAPI = JSON.parse('{"external-profile":{"firstname":"manu","lastname":"chadha","email":"test@test.com"}}');
    console.log('dummy profile 2 is ',dummyProfile2);
    console.log('dummy profile1 == dummy profile 2',(dummyUserProfile == dummyProfile2));
    console.log('dummy profile1 === dummy profile 2',(dummyUserProfile == dummyProfile2));
    expect(dummyUserProfile).toEqual(dummyProfile2);
    expect(dummyUserProfile).toBe(dummyProfile2);
  });

在上述情况下,dummyUserProfile打印为LOG: 'dummy profile is ', UserProfileAPI{external-profile: User{firstname: 'manu', lastname: 'chadha', email: 'test@test.com', password: ''}},而dummyProfile2打印为LOG: 'dummy profile 2 is ', Object{external-profile: Object{firstname: 'manu', lastname: 'chadha', email: 'test@test.com'}},并且两个比较都返回false。为什么?

1 个答案:

答案 0 :(得分:0)

首先,正如其他一些人在评论中已经说过的那样:在JS对象中,除非它们是相同的 reference ,否则决不要=====。按值的平等不起作用,即{} == {}始终为假。但是给定像const obj = {}这样的对象,那么obj == obj是正确的。这与TypeScript无关。

现在是您问题的这一部分:

  

我试图确定Typescript对象是否与Javascript对象相同。我有一个typescript变量,我想将JSON.parse的结果转换成类型,我想从javascript object创建一个json,但是我做不到。

您应该了解以下两个重要事项:

  • 您所说的“ TypeScript对象”和“ JavaScript对象”实际上是JavaScript对象的构造函数(或实例)和普通的JavaScript对象。同样,这与TypeScript无关。在ES6中,您可以定义class object types,甚至在ES5中,您也可以使用老式的constructor function

  • 您在TypeScript中所谓的“类型转换”实际上只是一个类型分配(或者您可能尝试过type "assertion"),这意味着它不会以任何方式更改对象,它只是通知编译器您假定对象的类型。您可以将any分配给任何类型,但这并不意味着它是正确的。实际上,有很多方法可以通过编写错误的类型分配和断言来破坏代码。

因此,您真正的问题是JSON.parse()给您一个普通的JS对象,并且您想将其变成一个JS对象类型实例。不幸的是,JS中没有内置的方法可以执行此操作,但是您当然可以在解码JSON之后手动执行此操作。参见:Parse JSON String into a Particular Object Prototype in JavaScript

您的情况下的一个简单示例如下所示:

function decodeUserFromJSON(userJSON: string): User {
   const userObj = JSON.parse(userJSON);
   const { firstname, lastname, email, password } = userObj;
   const user = new User(firstname, lastname, email, password);
   return user;
}

根据测试框架比较对象实例的方式,您应该能够检查是否相等,如下所示:

const user = new User("a", "b", "foo@bar.com", "1");
const decodedUser = decodeUserFromJSON(`{"firstname": "a", "lastname": "b", "email": "foo@bar.com", "password": "1" }`);
expect(decodedUser).toEqual(user);