MST

星途 面试题库

面试题:TypeScript类型擦除与函数重载

在TypeScript中,函数重载利用了类型系统。由于类型擦除机制,运行时这些重载函数如何区分?请举例说明在实现函数重载时,如何确保类型安全且考虑到类型擦除的影响。
45.2万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
  1. 运行时区分重载函数
    • 在TypeScript中,由于类型擦除,运行时并没有实际的“重载函数”概念。JavaScript本身不支持函数重载,TypeScript的函数重载是在编译期通过类型系统来实现的。
    • 例如,假设有如下TypeScript函数重载定义:
    function add(a: number, b: number): number;
    function add(a: string, b: string): string;
    function add(a: any, b: any): any {
        if (typeof a === 'number' && typeof b === 'number') {
            return a + b;
        } else if (typeof a ==='string' && typeof b ==='string') {
            return a + b;
        }
        return null;
    }
    
    • 在运行时,实际执行的是最后那个统一实现的函数add。TypeScript编译器会根据传入参数的类型,在编译期选择合适的重载定义进行类型检查,但运行时只有一个函数体。
  2. 确保类型安全且考虑类型擦除影响
    • 明确重载定义:首先要在函数声明部分明确写出不同参数类型组合的重载定义。例如上述add函数,分别定义了接收两个number类型参数和两个string类型参数的重载。
    • 统一实现检查:在统一的函数实现体中,要根据传入参数的实际类型进行检查和处理。如上述add函数实现中,通过typeof检查参数类型,确保不同类型输入有正确的处理逻辑,从而保证类型安全。这样即使在运行时类型信息被擦除,也能正确处理不同类型的输入。