我试图确定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;
}
}
我已经创建了一个规范来测试明确创建的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
。为什么?
答案 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);