面试题答案
一键面试类型检查
在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
属性,如果再次调用函数不传入参数,会使用已被修改的默认值对象。如果传入新的实现类实例,函数会使用传入的实例而不受默认值修改的影响。