Created
August 3, 2022 10:33
-
-
Save iTonyYo/6b4e1e6ae00a6ea3d18248a451ebd922 to your computer and use it in GitHub Desktop.
显然,在期望父类型的地方使用对象类型是不安全的。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
type ExistingUser = { | |
id: number | |
name: string | |
} | |
// WT 是 ExistingUser 的超类型 | |
type WT = { id?: number, name: string } | |
// 这里是期望父类型的地方 | |
function delUser(user: { id?: number, name: string }) { | |
delete user.id | |
} | |
let existingUser: ExistingUser = { | |
id: 12345, | |
name: 'User' | |
}; | |
// 删除了 existingUser 中的 id 字段 | |
delUser(existingUser); | |
/** | |
* 目前 existingUser 已经变成 { name: 'User' }, | |
* 已经没了 id 字段,不符合 existingUser 的类型描 | |
* 述,但 TS 没报错 | |
*/ | |
delUser(existingUser); | |
/** | |
* existingUser 的类型描述的确依然是 { id: number; name: string; }, | |
* existingUser 也已经变成 { name: 'User' }, | |
* 但也的确没报错 | |
*/ | |
type abc = typeof existingUser | |
// { name: 'User' } | |
console.log(existingUser); | |
/** | |
* 显然,在期望父类型的地方使用对象类型是不安全 | |
* 的。(不安全点:不确定函数块里哪里暴力修改了 | |
* 传进来的对象,但 TS 无法捕获到) | |
*/ | |
/** | |
* 一般来说,TS 在设计上不是只顾安全性的,TS 的 | |
* 类型系统尽量在捕获问题、易于使用上达成平衡。 | |
* 显然 TS 在上述情况放宽了要求,副作用便是不安 | |
* 全。 | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment