首页 > 解决方案 > Javascript对象和Typescript对象的区别

问题描述

我试图弄清楚一个Typescript对象是否与一个对象相同Javascript。我有一个typescript变量,我想将结果类型转换为该变量,我想它会从 aJSON.parse创建一个,但我无法做到。javascript objectjson

我有以下两个课程

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

我创建了一个规范来测试object明确创建的对象是否与创建的对象相同或相似,json.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。为什么?

标签: typescript

解决方案


首先,正如其他几个人已经在评论中所说的那样:在 JS 对象中永远不会=====除非它们是相同的引用。价值平等是行不通的,即{} == {}总是错误的。但是给定一个像const obj = {}then这样的对象obj == obj是真的。这与 TypeScript 无关。

现在到你问题的这一部分:

我试图弄清楚一个Typescript对象是否与一个对象相同Javascript。我有一个typescript变量,我想将结果类型转换为该变量,我想它会从 aJSON.parse创建一个,但我无法做到。javascript objectjson

这里有两件重要的事情你应该明白:

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

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

所以你真正的问题是JSON.parse()给你一个普通的 JS 对象,你想把它变成一个 JS 对象类型的实例。不幸的是,在 JS 中没有内置的方法可以做到这一点,但当然你可以在解码 JSON 后手动做到这一点。请参阅:将 JSON 字符串解析为 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);

推荐阅读