TypeScript 结构化类型与函数兼容性
解释 TypeScript 为什么按成员形状判断兼容性,以及该规则对对象、回调参数和函数赋值的影响。
#type / concept
#status / growing
#tech / dev
#resource / typescript
[!info] related notes
- 对象类型:TypeScript 对象类型、type 与 interface
- 函数检查:TypeScript 中的 strictFunctionTypes
- Python 对照:Python Protocol 与结构化类型
TypeScript 结构化类型与函数兼容性
一句话定义
TypeScript 主要按值拥有哪些成员判断类型兼容,而不是要求两个类型具有相同声明名称。
interface HasId {
id: string;
}
const user = { id: 'u1', name: 'Lin' };
const identifiable: HasId = user;
额外的 name 不妨碍赋值,因为使用方只承诺读取 id。
新鲜对象检查
对象字面量直接赋值时会执行额外属性检查,帮助发现拼写错误:
const value: HasId = { id: 'u1', nmae: 'Lin' }; // 报错
这不是结构化类型失效,而是对象字面量获得了更严格的防错检查。
函数兼容性
回调是否兼容不仅看返回值,还涉及参数方向。开启 strictFunctionTypes 后,函数参数会得到更安全的检查,避免把只能处理窄类型的函数交给需要处理宽类型的位置。
工程意义
- 接口可以描述“最低能力”,无需显式 implements。
- 测试替身只需满足被测代码真正使用的形状。
- 过大的接口会让实现和测试一起变重,应保持接口聚焦。
- 结构兼容不验证运行时来源;网络数据仍需校验。