InterfaceA
类型的变量能否赋值给InterfaceB
类型的变量:
- 可以。
- 原因:在TypeScript中,接口遵循赋值兼容性规则。
InterfaceB
是InterfaceA
的超集(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赋值,在实际使用中可能会出现运行时错误,但类型检查时是允许这样赋值的
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;