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

TypeScript定义FormatOptions枚举传参类型报错如何正确编写

问题描述

我编写了一个接收date和format两个参数的函数,尝试为format参数定义名为FormatOptions的字符串枚举,编译时出现类型报错:

Argument of type '"HH:MM"' is not assignable to parameter of type 'FormatOptions'

即类型为"HH:MM"的参数无法赋值给FormatOptions类型的形参,需要找到第二个参数的正确枚举定义及使用方式。

TypeScript Playground 在线调试地址:点击访问

问题复现代码

const basicTime: any = {
  year: 'numeric',
  month: 'short',
  day: '2-digit',
  hour: 'numeric',
  minute: 'numeric',
};

const hoursMinutes: any = {
  hour: 'numeric',
  minute: 'numeric',
};

enum FormatOptions {
  HoursMinutes = 'HH:MM',
  MonthDayYear = 'MM/DD/YYYY',
};

const dateFormat = (date: Date, format: FormatOptions) => {
  if (format === 'HH:MM') {
    return new Date(date).toLocaleString('en-US', hoursMinutes);
  }

  return new Date(date).toLocaleString('en-US', basicTime);
};

dateFormat(new Date, 'HH:MM');
报错根因

TypeScript 字符串枚举不会自动和同内容的原始字符串字面量做类型兼容。当你将参数类型标注为FormatOptions枚举类型后,直接传入原始字符串'HH:MM'属于类型不匹配;同时函数内部直接用原始字符串和枚举类型参数做等值判断,也不符合类型规范。

修复方案
  • 你写的枚举定义本身没有错误,问题出在枚举的使用方式上:调用函数时需要传入枚举成员,而非直接传入裸字符串字面量
  • 函数内部的条件判断同步替换为枚举成员做比较,保证类型一致性

修复后可正常运行的代码:

const basicTime: any = {
  year: 'numeric',
  month: 'short',
  day: '2-digit',
  hour: 'numeric',
  minute: 'numeric',
};

const hoursMinutes: any = {
  hour: 'numeric',
  minute: 'numeric',
};

enum FormatOptions {
  HoursMinutes = 'HH:MM',
  MonthDayYear = 'MM/DD/YYYY',
};

const dateFormat = (date: Date, format: FormatOptions) => {
  // 替换为枚举成员做判断
  if (format === FormatOptions.HoursMinutes) {
    return new Date(date).toLocaleString('en-US', hoursMinutes);
  }

  return new Date(date).toLocaleString('en-US', basicTime);
};

// 传入枚举成员,而非直接写字符串,同时补全新Date()的括号
dateFormat(new Date(), FormatOptions.HoursMinutes);

补充:如果希望调用时直接传入字符串字面量、不需要加枚举前缀,可以放弃枚举,改用字符串字面量联合类型实现相同效果,示例代码如下:

type FormatOptions = 'HH:MM' | 'MM/DD/YYYY';

const dateFormat = (date: Date, format: FormatOptions) => {
  if (format === 'HH:MM') {
    return new Date(date).toLocaleString('en-US', hoursMinutes);
  }
  return new Date(date).toLocaleString('en-US', basicTime);
};

// 直接传字符串不会触发类型报错
dateFormat(new Date(), 'HH:MM');

内容的提问来源于stack exchange,提问作者Sweet Caramel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:31:04