MST
星途 面试题库

面试题:TypeScript默认参数在复杂类型系统中的行为分析

假设有一个复杂的类型系统,包含多个接口和类继承关系。定义一个函数,其参数具有默认值,该参数类型为一个接口类型,这个接口有多个实现类。分析在这种情况下,TypeScript如何处理默认参数的类型检查和运行时行为。如果在函数内部修改默认参数对象的属性,会对类型系统产生什么影响?请详细说明并给出相关代码示例。
37.7万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

类型检查

在TypeScript中,当函数参数有默认值且类型为接口时,TypeScript会在编译时根据接口的定义对默认值进行类型检查。默认值必须满足接口所定义的结构和类型约束。

运行时行为

在运行时,函数会使用默认值作为参数的初始值。如果调用函数时未传入该参数,就会使用默认值。

修改默认参数对象属性的影响

在函数内部修改默认参数对象的属性,只要修改后的属性符合接口定义,不会对类型系统产生编译错误。但这可能会导致一些意外行为,因为默认参数对象是共享的,多次调用函数如果依赖默认值,可能会因为之前调用对默认值的修改而受到影响。

代码示例

// 定义接口
interface MyInterface {
    prop1: string;
    prop2: number;
}

// 定义接口的实现类
class MyClass1 implements MyInterface {
    prop1 = 'value1';
    prop2 = 1;
}

class MyClass2 implements MyInterface {
    prop1 = 'value2';
    prop2 = 2;
}

// 定义函数,参数有默认值
function myFunction(param: MyInterface = new MyClass1()) {
    // 在函数内部修改默认参数对象的属性
    param.prop1 = 'new value';
    console.log(param);
}

// 调用函数,不传入参数
myFunction(); 
// 再次调用函数,由于默认参数对象是共享的,prop1已经被修改
myFunction(); 

// 调用函数并传入参数
myFunction(new MyClass2()); 

在上述代码中,myFunction函数参数param有默认值new MyClass1()。在函数内部修改param.prop1属性,如果再次调用函数不传入参数,会使用已被修改的默认值对象。如果传入新的实现类实例,函数会使用传入的实例而不受默认值修改的影响。