MST

星途 面试题库

面试题:TypeScript 中类型兼容性如何影响类型推断

请举例说明在 TypeScript 中,类型兼容性规则是怎样影响函数参数和返回值的类型推断的。例如,假设有两个接口 `A` 和 `B`,`B` 继承自 `A`,写一个函数,其参数类型为 `A`,在函数调用时传入 `B` 类型的实例,分析这个过程中类型推断是如何进行的。
18.0万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

在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),同样也是允许的,因为BA的子类型,满足返回值类型的结构要求。例如:

function getName(): A {
    return { name: 'Jane' };
}

function getNameWithAge(): A {
    return { name: 'Bob', age: 25 }; 
}

这里getNameWithAge函数返回了B类型的值,虽然声明的返回类型是A,但由于B兼容A,所以类型推断认为是合法的。这展示了返回值类型推断中类型兼容性规则的作用,即返回值类型只要是声明返回类型的子类型就满足要求。