先问大家一个问题,给定俩个对象该怎么“快速”比较其是否等价?
转字符串比较吗?如果参数顺序不一致呢
遍历吗?可以
但如果嵌套层级过深呢? 好似俩颗树结构比较
深度优先遍历?可以?
如果项目中仅仅是一处比较,暂时这么写当然没有问题,倘若存在很多很多很多组对象呢,届时就达不到快速的基准了。
可能会纳闷,为什么要问这个问题,这个跟主题 ts 类型有什么关联
举个很常见的示例,函数不同情况返回不同参数,猜猜他的返回类型会是什么
const demo = () => {
if (1) {
return {
name: 'xxx',
age: 1
}
}
else {
return 1
}
return {
age: 2,
name: "wwww"
}
}
type DemoReturn = ReturnType<typeof demo>
// 输入:
// 1 | {
// name: string;
// age: number;
// }
通过获取函数返回类型,观察其结果类型,你会惊讶的发现,其结果并不是如下所示
DemoReturn = {
name: string,
age: number
} | 1 | {
age: number,
name: string
}
这正是因为 ts 内部联合类型进行了比较并删除了相同类型
todo:
- 显示联合类型不会自动展开计算结果譬如
TypeA | TypeB- 而隐式联合类型会进行联合运算,譬如函数返回类型
那么回归开头的问题,既然 ts 内部也有对象类型比较,
他是否解决了上面抛出了一系列问题,又是否用到了什么黑魔法,
一起来揭开他神秘的面纱
ts 会为所有基础类型维护全局 map 存储,相同字面量指向同一Type 引用