MST

星途 面试题库

面试题:TypeScript可选参数、默认参数与类型推断的复杂交互

设计一个复杂的TypeScript模块,其中包含多个相互调用的函数,这些函数使用了可选参数和默认参数。要求在模块中,通过类型推断实现类型安全且高效的代码编写。请解释在这个模块中,可选参数和默认参数是如何影响类型推断过程的,以及如何避免因它们导致的类型相关问题。
25.6万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

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。如果使用了对象解构来获取可选参数,确保对象属性存在或者提供默认值。
  • 针对默认参数
    • 保持类型一致性:确保默认值的类型与函数参数期望的类型一致。如果默认值类型错误,会导致类型推断错误,进而可能在函数调用时出现类型不匹配的问题。
    • 注意函数重载:如果函数有多个重载签名,确保默认参数在每个重载中都有合理的处理,避免因重载导致的类型混淆。例如,如果一个函数有多个重载,其中一个重载有默认参数,要确保其他重载也能合理地处理该参数的各种情况。