TypeScript 结构化类型与函数兼容性

解释 TypeScript 为什么按成员形状判断兼容性,以及该规则对对象、回调参数和函数赋值的影响。

#type / concept #status / growing #tech / dev #resource / typescript

[!info] related notes

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。
  • 测试替身只需满足被测代码真正使用的形状。
  • 过大的接口会让实现和测试一起变重,应保持接口聚焦。
  • 结构兼容不验证运行时来源;网络数据仍需校验。
创建于 2026/7/29 更新于 2026/7/29