You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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'

实现逻辑说明

  1. 用函数重载分别适配单参数、双参数两种调用场景,保证两种场景下TypeScript类型推导完全准确,不会出现类型兼容问题。
  2. 给第二个参数添加默认值RequestTypes,运行时无需传参即可使用内置枚举。
  3. 实现处的as C为安全断言:只有触发单参数重载时才会使用默认值,此时泛型C的实际类型就是typeof RequestTypes,不存在类型不匹配风险。

内容的提问来源于stack exchange,提问作者Shannon Hochkins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 19:24:06