类型兼容性
约 342 字大约 1 分钟
2026-02-09
结构化类型系统
TypeScript 使用结构化类型系统(Structural Typing):
- 关注“结构是否兼容”
- 不要求显式继承关系
interface Duck {
swim: () => void
}
const personLikeDuck = {
swim: () => console.log('swim'),
name: 'zjs',
}
const duck: Duck = personLikeDuck // OK对象字面量的额外属性检查
直接赋值对象字面量时,检查会更严格。
interface User {
name: string
age: number
}
const u1: User = {
name: 'zjs',
age: 18,
// height: 180, // 报错:额外属性
}如果先赋给中间变量,再赋值给目标类型,通常不会触发额外属性检查。
const raw = { name: 'zjs', age: 18, height: 180 }
const u2: User = raw // OK提示
额外属性检查的目标是帮助你尽早发现对象字面量拼写错误,而不是改变结构化类型的本质。
函数兼容性(参数与返回值)
type HandlerA = (x: number) => void
type HandlerB = (x: number, y: string) => void
const a: HandlerA = (x) => console.log(x)
const b: HandlerB = (x, y) => console.log(x, y)
// 赋值兼容性受 strictFunctionTypes 等配置影响在开启严格配置时,函数参数位置会更严格,避免不安全赋值。
提升可维护性的建议
- 公共类型优先抽离到独立
types文件 - 对外暴露的对象参数优先用接口约束
- 对含糊的兼容赋值增加显式类型声明,减少“意外通过”
