在 TypeScript 中,您可以对从某个类型扩展的接口进行类型检查,而不需要显式的类型保护。这是因为 TypeScript 的类型系统是基于结构的(structural typing),这意味着类型的兼容性是基于其结构而不是其名称。
假设我们有一个基本的接口 Base
和一个扩展自 Base
的接口 Extended
:
interface Base {
id: number;
name: string;
}
interface Extended extends Base {
age: number;
}
您可以创建一个函数,该函数接受一个 Base
类型的参数,并在函数内部检查该参数是否符合 Extended
类型的结构,而不需要使用类型保护。
function processEntity(entity: Base) {
// 直接检查属性
if ('age' in entity) {
// 这里 TypeScript 知道 entity 可能是 Extended 类型
console.log(`Entity age: ${entity.age}`);
} else {
console.log(`Entity ID: ${entity.id}, Name: ${entity.name}`);
}
}
// 示例数据
const baseEntity: Base = { id: 1, name: 'Base Entity' };
const extendedEntity: Extended = { id: 2, name: 'Extended Entity', age: 30 };
// 调用函数
processEntity(baseEntity); // 输出: Entity ID: 1, Name: Base Entity
processEntity(extendedEntity); // 输出: Entity age: 30
processEntity
函数中,我们接受一个 Base
类型的参数 entity
。我们可以通过检查 entity
是否具有 age
属性来判断它是否是 Extended
类型。instanceof
或自定义类型保护函数),但我们通过属性检查('age' in entity
)来实现了类型的判断。if
语句中,TypeScript 会推断 entity
的类型为 Extended
,因此可以安全地访问 age
属性。
领取专属 10元无门槛券
手把手带您无忧上云