typescript - Javascript对象和Typescript对象的区别
问题描述
我试图弄清楚一个Typescript
对象是否与一个对象相同Javascript
。我有一个typescript
变量,我想将结果类型转换为该变量,我想它会从 aJSON.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
。为什么?
解决方案
首先,正如其他几个人已经在评论中所说的那样:在 JS 对象中永远不会==
或===
除非它们是相同的引用。价值平等是行不通的,即{} == {}
总是错误的。但是给定一个像const obj = {}
then这样的对象obj == obj
是真的。这与 TypeScript 无关。
现在到你问题的这一部分:
我试图弄清楚一个
Typescript
对象是否与一个对象相同Javascript
。我有一个typescript
变量,我想将结果类型转换为该变量,我想它会从 aJSON.parse
创建一个,但我无法做到。javascript object
json
这里有两件重要的事情你应该明白:
您所说的“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);
推荐阅读
- python - django查询集中的sql字符串无法在pymysql中执行?
- django - 如何更新扩展的 Django 用户模型?
- intellij-idea - 如何让版本控制选项卡出现在 intellij 中?
- html - 引导,容器流体类不能改变填充
- excel - 如何将 VBA 函数应用于选定范围并将结果粘贴到同一范围?
- javascript - 在控制台中显示值 shoe false
- macos - 如何禁用 NSOutlineView 的自动编辑
- reactjs - POST https://google-translate1.p.rapidapi.com/language/translate/v2 502 (Bad Gateway) 在 React 中获取时
- reactjs - RadioGroup 没有从单选按钮获取正确的值 - Material UI
- c# - 为什么使用连接子句连接两个相关的 CSV 文件会产生单个元素而不是元素序列?