typescript - 代替字符串枚举,使用联合类型和静态声明
问题描述
在我看来,以下类型在 TypeScript 中比使用 Enums 更好。但是有没有办法简化这个?例如,我可能使用的实用程序类型。IMO 我们应该能够定义以这种方式工作的枚举,但据我所知,我们不能。
当前代码说明:
StepWizardEventType
限制事件类型可以是的值,const
用于在代码中访问值本身。const 的类型{ [prop: string]: StepWizardEventType }
允许将变量/属性键入StepWizardEventType
并设置为 const 中的值之一stepWizardEventTypes
。
export type StepWizardEventType = 'cancel' | 'create' | 'init' | 'next' | 'previous' | 'reset' | 'save';
export const stepWizardEventTypes: { [Property in StepWizardEventType]: StepWizardEventType } = {
cancel: 'cancel',
create: 'create',
init: 'init',
next: 'next',
previous: 'previous',
reset: 'reset',
save: 'save',
};
export interface StepEvent {
type: StepWizardEventType;
}
// somewhere else in another file...
const event: StepEvent = {
type: stepWizardEventTypes.cancel // compiler doesn't complain here! yay!
}
编辑:示例枚举使用使编译器不高兴。
export enum EventTypes {
cancel = 'cancel',
create = 'create'
}
type EventType = 'cancel' | 'create';
interface Dodad {
eventType: EventType;
}
const doDadInstance: Dodad = {
eventType: EventTypes.cancel // TypeScript complains here for enums
}
解决方案
这是基于来自@jcalz 的反馈。仍然认为有简化的空间,但这更好。
type enumPropertyKey = { readonly [P in string]: P };
const makeIdEnum = <K extends string>(...kvs: K[]): enumPropertyKey => Object.fromEntries(
kvs.map(kv => [kv, kv])
) as enumPropertyKey;
// example usage
const stepWizardEventTypes = makeIdEnum('cancel', 'create', 'init', 'next', 'previous', 'reset', 'save');
type StepWizardEventType = keyof typeof stepWizardEventTypes;
export interface StepEvent {
type: StepWizardEventType;
}
// somewhere else in another file...
const event: StepEvent = {
type: stepWizardEventTypes.cancel
}
推荐阅读
- haskell - 使用列表理解我如何计算字符列表中有多少位
- laravel - 使用 Laravel Echo 加入频道时,如何判断身份验证失败?
- html - 在不同的屏幕尺寸上重用导航栏中的代码有哪些选项?
- git - 错误:将 git-lfs 推送到 GitLab 时无法推送一些参考
- python - 添加简单约束时,为什么 CVXPy 或 DMCP 返回“NoneType”?
- javascript - 比较两个嵌套数组和对象以查找差异
- arrays - MongoDB $and 仅当 $and 在文档的同一数组索引中为真时才查询 - 特别是对于双重嵌套数组
- git - Git:克隆具有父层次结构的存储库
- flutter - android studio 中未显示 dart 分析器工具窗口
- javascript - 如何为不同的域设置 cookie?