设计思路
- 定义策略函数类型:使用类型别名定义不同策略函数的类型,每个策略函数有不同的参数和返回值类型。
- 函数重载:通过函数重载,为每个策略类型定义一个
executeStrategy
的重载签名,确保传入不同策略类型和参数时类型检查正确。
- 泛型:使用泛型来捕获策略函数的返回值类型,以便
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);