面试题答案
一键面试在TypeScript中,类型兼容性基于结构子类型系统。当B
继承自A
时,B
类型的实例可以赋值给A
类型的变量,因为B
包含了A
的所有属性和方法,满足A
的结构要求。
示例代码如下:
interface A {
name: string;
}
interface B extends A {
age: number;
}
function printName(a: A) {
console.log(a.name);
}
let b: B = { name: 'John', age: 30 };
printName(b);
在上述代码中,printName
函数接受A
类型的参数。当我们传入B
类型的实例b
时,由于B
继承自A
,满足A
的结构(即包含name
属性),所以类型推断允许这样的调用。这体现了类型兼容性规则使得函数参数类型的推断更加灵活,只要传入的类型满足参数类型的结构要求即可。
对于返回值类型推断,如果一个函数声明返回A
类型,而实际返回了B
类型(B
继承自A
),同样也是允许的,因为B
是A
的子类型,满足返回值类型的结构要求。例如:
function getName(): A {
return { name: 'Jane' };
}
function getNameWithAge(): A {
return { name: 'Bob', age: 25 };
}
这里getNameWithAge
函数返回了B
类型的值,虽然声明的返回类型是A
,但由于B
兼容A
,所以类型推断认为是合法的。这展示了返回值类型推断中类型兼容性规则的作用,即返回值类型只要是声明返回类型的子类型就满足要求。