如何用TypeScript函数式风格实现指定OO汽车启动设计?
TypeScript函数式实现汽车启动设计方案
1. 定义通用汽车类型契约
用TypeScript接口描述通用汽车的核心能力,对应原OOP中的Car类型:
interface Car { start(): void; // 可扩展其他通用汽车方法 }
2. 手动变速箱汽车的函数式实现
通过高阶函数封装固定启动流程,将钩子方法作为参数传入,同时提供默认实现支持复用或重写:
2.1 定义钩子方法类型
type ManualCarHooks = { pressClutch: () => void; checkGearPosition: () => void; // 允许重写的默认方法 turnIgnitionKey?: () => void; };
2.2 封装固定启动流程的高阶函数
// 生成手动变速箱汽车start方法的高阶函数 const createManualCarStart = (hooks: ManualCarHooks): () => void => { // 默认点火实现 const defaultTurnIgnitionKey = () => { console.log("转动点火钥匙"); }; // 解构钩子,优先使用传入方法,无则用默认实现 const { pressClutch, checkGearPosition, turnIgnitionKey = defaultTurnIgnitionKey } = hooks; // 固定启动流程 return () => { pressClutch(); checkGearPosition(); turnIgnitionKey(); console.log("手动变速箱汽车启动完成"); }; };
2.3 创建具体手动变速箱实例
// 基础手动挡汽车 const basicManualCar: Car = { start: createManualCarStart({ pressClutch: () => console.log("踩下离合器"), checkGearPosition: () => console.log("检查档位在空挡"), // 复用默认点火方法 }), }; // 重写点火逻辑的手动挡汽车 const customManualCar: Car = { start: createManualCarStart({ pressClutch: () => console.log("用力踩下离合器"), checkGearPosition: () => console.log("确认档位处于空挡或驻车挡"), turnIgnitionKey: () => console.log("按下一键启动按钮"), }), };
3. 其他车型的自由实现
直接实现Car接口即可,无需依赖固定模板:
// 自动挡汽车 const automaticCar: Car = { start: () => { console.log("踩下刹车"); console.log("按下一键启动"); console.log("自动挡汽车启动完成"); }, }; // 新能源汽车 const electricCar: Car = { start: () => { console.log("踩下刹车"); console.log("按下启动按钮"); console.log("检查电池电量"); console.log("新能源汽车启动完成"); }, };
4. 使用示例
basicManualCar.start(); customManualCar.start(); automaticCar.start(); electricCar.start();
内容的提问来源于stack exchange,提问作者zzheng
相关产品推荐
相关产品推荐

