Skip to content

Instantly share code, notes, and snippets.

@iTonyYo
Created August 3, 2022 10:33
Show Gist options
  • Save iTonyYo/6b4e1e6ae00a6ea3d18248a451ebd922 to your computer and use it in GitHub Desktop.
Save iTonyYo/6b4e1e6ae00a6ea3d18248a451ebd922 to your computer and use it in GitHub Desktop.
显然,在期望父类型的地方使用对象类型是不安全的。
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