MST

星途 面试题库

面试题:TypeScript类型兼容性之接口兼容性基础

在TypeScript中,假设有两个接口`InterfaceA`和`InterfaceB`,`InterfaceA`有属性`name: string`,`InterfaceB`有属性`name: string`和`age: number`。请说明`InterfaceA`类型的变量能否赋值给`InterfaceB`类型的变量,以及`InterfaceB`类型的变量能否赋值给`InterfaceA`类型的变量,并解释原因。
34.6万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
  1. InterfaceA类型的变量能否赋值给InterfaceB类型的变量
    • 可以。
    • 原因:在TypeScript中,接口遵循赋值兼容性规则。InterfaceBInterfaceA的超集(InterfaceB包含InterfaceA的所有属性name: string,还额外有age: number属性)。当把InterfaceA类型的变量赋值给InterfaceB类型的变量时,满足赋值兼容性,因为InterfaceA所包含的属性在InterfaceB中都有,只是InterfaceB多了其他属性。例如:
interface InterfaceA {
    name: string;
}
interface InterfaceB {
    name: string;
    age: number;
}
let a: InterfaceA = {name: 'test'};
let b: InterfaceB = a as InterfaceB;
console.log(b.name);
console.log(b.age); // 这里如果没有给b.age赋值,在实际使用中可能会出现运行时错误,但类型检查时是允许这样赋值的
  1. InterfaceB类型的变量能否赋值给InterfaceA类型的变量
    • 不可以。
    • 原因:InterfaceB包含InterfaceA没有的属性age。按照赋值兼容性规则,当把一个变量赋值给另一个变量时,赋值变量的类型必须是目标变量类型的子集(或者相等)。InterfaceB不是InterfaceA的子集,所以InterfaceB类型的变量不能赋值给InterfaceA类型的变量。例如:
interface InterfaceA {
    name: string;
}
interface InterfaceB {
    name: string;
    age: number;
}
let b: InterfaceB = {name: 'test', age: 18};
// 下面这行代码会报错,因为InterfaceB不是InterfaceA的子集
let a: InterfaceA = b;