【TypeScript】类型兼容性与相关类型讲解
// 定义两个接口,用于演示类型兼容性
interface Named {
name: string;
}
interface AgeNamed {
age: number;
name: string;
}
// 类型兼容性示例
function printName(x: Named) {
console.log(x.name);
}
// 正确:AgeNamed 类型兼容 Named,因为 AgeNamed 包含 Named 的所有必需类型
let obj1: AgeNamed = { name: "Alice", age: 25 };
printName(obj1);
// 错误:Named 不兼容 AgeNamed,因为 Named 不包含 AgeNamed 的 age 属性
// let obj2: Named = { name: "Bob" };
// printName(obj2);
// 使用类型断言来解决不兼容问题
let obj3: Named = { name: "Charlie", age: 27 }; // 这里添加了一个不在 Named 接口中定义的属性
printName(obj3); // 这将会报错,因为 TypeScript 类型检查
printName(obj3 as AgeNamed); // 使用类型断言来绕过类型检查
// 使用字符串字面量类型 key-value 对来解决不兼容问题
let obj4: Named = { name: "Daisy" };
printName(obj4);
let newObj4: AgeNamed = { ...obj4, age: 30 }; // 使用展开运算符创建一个新对象
printName(newObj4);
这段代码演示了TypeScript中的类型兼容性。printName
函数期望一个Named
类型的参数,而AgeNamed
类型是Named
类型的超集,因此AgeNamed
类型的对象可以传递给printName
函数。当尝试传递一个仅有Named
类型属性的对象时,会发生错误,因为AgeNamed
类型要求对象具有一个额外的age
属性。通过类型断言和字符串字面量类型 key-value 对,我们可以创建兼容AgeNamed
类型的对象,即使它们不是直接兼容的。这样的做法可以在不修改原有类型定义的情况下,让不兼容的类型对象能够被接受和使用。
评论已关闭