如何将TypeScript工具函数createActions的RequestTypes设为可选默认参数
最终实现方案
修改后的完整utils.ts代码如下:
// utils.ts export enum RequestTypes { Request, Success, Failure, } type CombineEnums<P, C> = { [KP in keyof P]: { [KC in keyof C]: KP extends string ? KC extends string ? `${KP}${KC}` : never : never; }; }; // 函数重载:单参数调用,默认使用内置RequestTypes export function createActions<P extends object>(actionTypes: P): CombineEnums<P, typeof RequestTypes>; // 函数重载:双参数调用,使用自定义请求类型枚举 export function createActions<P extends object, C extends object>(actionTypes: P, requestTypes: C): CombineEnums<P, C>; // 函数实现,给第二个参数添加默认值 export function createActions<P extends object, C extends object>( actionTypes: P, requestTypes: C = RequestTypes as C ) { const result: any = {}; for (const keyP of Object.keys(actionTypes)) { result[keyP] = {}; for (const keyC of Object.keys(requestTypes)) { result[keyP][keyC] = `${keyP}${keyC}`; } } return result; }
效果验证
场景1:默认调用(无需传RequestTypes)
// module.ts import { createActions } from './utils.ts'; enum Actions { Find, Create } const actions = createActions(Actions); // 类型、运行值完全符合预期: // actions.Find.Request -> 'FindRequest' // actions.Find.Success -> 'FindSuccess' // actions.Create.Failure -> 'CreateFailure'
场景2:自定义请求类型枚举
enum TabRequests { Open, Close } enum TabActions { Tab } const actions = createActions(TabActions, TabRequests); // 类型、运行值完全符合预期: // actions.Tab.Open -> 'TabOpen' // actions.Tab.Close -> 'TabClose'
实现逻辑说明
- 用函数重载分别适配单参数、双参数两种调用场景,保证两种场景下TypeScript类型推导完全准确,不会出现类型兼容问题。
- 给第二个参数添加默认值
RequestTypes,运行时无需传参即可使用内置枚举。 - 实现处的
as C为安全断言:只有触发单参数重载时才会使用默认值,此时泛型C的实际类型就是typeof RequestTypes,不存在类型不匹配风险。
内容的提问来源于stack exchange,提问作者Shannon Hochkins
相关产品推荐
相关产品推荐

