TypeScript中未知字符串枚举参数应使用什么类型定义?
类型定义修改方案
报错原因
TypeScript的函数参数符合逆变特性:你原代码中
func的callback参数声明为接收string类型入参,此时传入的回调只能接收范围大于等于string的类型;而Category、OtherCategory这类字符串枚举的成员是比string更窄的字面量联合类型,就会出现类型不兼容的报错。
解决方案
使用泛型将枚举值的类型和回调入参的类型做绑定,修改后的func定义如下:
// 泛型 T 代表传入枚举的成员值类型 const func = <T extends string>( enumerator: Record<string | number, T>, callback: (value: T) => string, ) => Object.values(enumerator).map(callback);
修改后原有调用代码无需任何调整,TypeScript会自动根据你传入的枚举类型推导T的实际类型,既能通过类型校验,也能保留完整的类型提示能力。
如果后续需要兼容数字枚举,只需要把泛型约束修改为<T extends string | number>即可,其余逻辑保持不变。
内容的提问来源于stack exchange,提问作者adesurirey
相关产品推荐
相关产品推荐

