1. 设计复杂TypeScript模块示例
// 定义一个模块
export module ComplexModule {
// 函数1:使用默认参数
export function functionWithDefaultParam(param: string = 'defaultValue'): string {
return `Function with default param: ${param}`;
}
// 函数2:使用可选参数
export function functionWithOptionalParam(param?: number): string {
if (param) {
return `Function with optional param: ${param}`;
} else {
return 'No optional param provided';
}
}
// 相互调用的函数3
export function combinedFunction(): string {
const defaultResult = functionWithDefaultParam();
const optionalResult = functionWithOptionalParam(10);
return `${defaultResult} and ${optionalResult}`;
}
}
2. 可选参数和默认参数对类型推断的影响
- 可选参数:
- 当函数定义了可选参数时,TypeScript会自动将该参数的类型推断为该参数类型的联合类型加上
undefined
。例如,functionWithOptionalParam(param?: number)
中,param
的类型实际是number | undefined
。这意味着在函数内部使用该参数时,需要进行类型检查,以确保在使用param
的属性或方法时不会因为其可能为undefined
而导致运行时错误。
- 这种类型推断使得函数调用者在调用函数时可以选择不传该参数,增加了函数调用的灵活性。同时,类型系统能够准确地反映这种灵活性,保证类型安全。
- 默认参数:
- 对于有默认参数的函数,TypeScript会根据默认值的类型推断参数的类型。例如,
functionWithDefaultParam(param: string = 'defaultValue')
中,param
的类型为string
。在函数调用时,如果没有传入参数,就会使用默认值,而传入参数时,参数类型必须符合推断出的类型(这里是string
)。
- 类型推断的过程中,默认参数提供了一种便捷的方式来确定参数类型,并且使得函数在调用时更加简洁,因为调用者可以不传入具有默认值的参数。
3. 避免因它们导致的类型相关问题
- 针对可选参数:
- 显式类型检查:在函数内部使用可选参数前,始终进行显式的类型检查,比如使用
typeof
操作符。在functionWithOptionalParam
中,通过if (param)
检查param
是否为undefined
,确保在后续使用param
时不会出现类型错误。
- 使用
undefined
防护:在调用函数时,确保传入的参数在赋值给可选参数前不会是undefined
,除非你有意传入undefined
。如果使用了对象解构来获取可选参数,确保对象属性存在或者提供默认值。
- 针对默认参数:
- 保持类型一致性:确保默认值的类型与函数参数期望的类型一致。如果默认值类型错误,会导致类型推断错误,进而可能在函数调用时出现类型不匹配的问题。
- 注意函数重载:如果函数有多个重载签名,确保默认参数在每个重载中都有合理的处理,避免因重载导致的类型混淆。例如,如果一个函数有多个重载,其中一个重载有默认参数,要确保其他重载也能合理地处理该参数的各种情况。