MST

星途 面试题库

面试题:TypeScript 函数重载与泛型在设计模式中的深度应用

在一个基于 TypeScript 的项目中,要实现一个类似策略模式的功能。有多个不同类型的数据处理策略,每个策略都是一个函数,这些函数接受不同类型的参数并返回不同类型的结果。请使用函数重载与泛型结合的方式,设计一个通用的 `executeStrategy` 函数,该函数能够根据传入的策略类型和相应参数,正确调用对应的策略函数并返回正确类型的结果。同时,要确保代码具有良好的扩展性和类型安全性。请详细阐述你的设计思路并写出关键的 TypeScript 代码。
30.0万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 定义策略函数类型:使用类型别名定义不同策略函数的类型,每个策略函数有不同的参数和返回值类型。
  2. 函数重载:通过函数重载,为每个策略类型定义一个 executeStrategy 的重载签名,确保传入不同策略类型和参数时类型检查正确。
  3. 泛型:使用泛型来捕获策略函数的返回值类型,以便 executeStrategy 能返回正确类型的结果。这样可以提高代码的扩展性,当有新的策略函数时,只需添加对应的重载签名即可。

关键 TypeScript 代码

// 定义不同策略函数的类型
type Strategy1Type = (param1: string) => number;
type Strategy2Type = (param2: number) => string;

// 实际的策略函数
const strategy1: Strategy1Type = (param1) => param1.length;
const strategy2: Strategy2Type = (param2) => param2.toString();

// 函数重载
function executeStrategy<Strategy extends Strategy1Type>(strategy: Strategy, param1: Parameters<Strategy>[0]): ReturnType<Strategy>;
function executeStrategy<Strategy extends Strategy2Type>(strategy: Strategy, param2: Parameters<Strategy>[0]): ReturnType<Strategy>;

// 函数实现
function executeStrategy(strategy: Strategy1Type | Strategy2Type, param: string | number) {
    if (typeof param ==='string' && typeof (strategy as Strategy1Type)(param) === 'number') {
        return (strategy as Strategy1Type)(param);
    } else if (typeof param === 'number' && typeof (strategy as Strategy2Type)(param) ==='string') {
        return (strategy as Strategy2Type)(param);
    }
    throw new Error('Invalid strategy or parameter');
}

// 使用示例
const result1 = executeStrategy(strategy1, 'hello');
const result2 = executeStrategy(strategy2, 123);