06 类型兼容性

类型兼容性 #

类型兼容性是 TypeScript 类型系统的一个核心特性,允许在某些情况下将一种类型赋值给另一种类型,即使它们不完全相同。

基本概念 #

TypeScript 使用结构化类型系统(structural typing),兼容性基于类型的形状(成员)而不是名称。如果目标类型的所有成员都在源类型中存在,则兼容。

使用场景 #

  • 函数参数和返回值的类型检查。
  • 接口和类的继承与实现。
  • 泛型中的类型约束。

示例代码 #

interface Named {
  name: string;
}

class Person {
  name: string;
}

let p: Named;
p = new Person(); // 兼容,因为 Person 有 name 属性

// 函数兼容性
function greet(person: Named) {
  console.log('Hello, ' + person.name);
}

function logName(x: { name: string }) {
  console.log(x.name);
}

greet = logName; // 兼容

最佳实践 #

  • 理解结构化类型以避免意外的兼容性错误。
  • 在设计接口时,考虑兼容性以提高灵活性。
  • 使用 never 类型或严格检查来限制不期望的兼容。