首页 > 解决方案 > 对于未知的字符串枚举参数,我应该使用什么类型?

问题描述

我正在尝试键入一个未知的字符串枚举参数,但没有成功,因为字符串枚举不能分配给字符串类型的参数。这是我的用例:

const func = (
  enumerator: Record<number, string>,
  callback: (value: string) => string,
) => Object.values(enumerator).map(callback);

enum Category {
  HAZARDOUS = "HAZARDOUS",
  REGULAR = "REGULAR",
}

enum OtherCategory {
  DRY = "DRY",
  REEFER = "REEFER",
}

func(Category, (value: Category) => t(value));
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
func(OtherCategory, (value: OtherCategory) => t(value));
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Argument of type '(value: Category) => string' is not assignable to parameter of type '(value: string) => string'.
  Types of parameters 'value' and 'value' are incompatible.
    Type 'string' is not assignable to type 'Category'.

我应该用什么来输入enumeratorvalue参数?

标签: javascripttypescript

解决方案


enum 是 TypeScript 中一种特殊的数据结构,我个人不能说它完全匹配Record<string, string>.

如果您需要Record<string, string>,最好使用这样的不可变对象:

const Category = {
  HAZARDOUS: "HAZARDOUS",
  REGULAR: "REGULAR",
} as const

我会这样输入:

enum Category {
  HAZARDOUS = "HAZARDOUS",
  REGULAR = "REGULAR",
}

type Values<T> = T[keyof T]

const func = <Enumerator extends Record<string, string>>(
    enumerator: Enumerator,
    callback: (value: Values<Enumerator>) => string,
) => (Object.values(enumerator) as Array<Values<Enumerator>>).map((value) => callback(value));


func(Category, (value /** Values<typeof Category> */) => 'sdf');

操场

我使用了类型断言,因为Object.values返回any[]


推荐阅读