【发布时间】:2018-09-28 20:53:24
【问题描述】:
如果有更简单的方法来写下来,因为这非常重复并且看起来非常错误......
const FolderVisibility = new Enum<{
PUBLIC: 'public',
PRIVATE: 'private'
}>({
PUBLIC: 'public',
PRIVATE: 'private'
}) as Enum<{
PUBLIC: 'public',
PRIVATE: 'private'
}> & {
PUBLIC: 'public',
PRIVATE: 'private'
}
我希望 IDE 能够告诉我 FolderVisibility.PUBLIC == 'public' 作为参数无论如何都是只读的。
这里是Enum类,它自己的属性很少,只有一个功能
export default class Enum<T extends { [index: string]: string }> {
private readonly map: T;
public readonly values: (T[keyof T])[];
constructor(enums: T) {
Object.defineProperty(this, 'map', { value: {} });
for (let prop in enums) {
if (enums.hasOwnProperty(prop)) {
const value = enums[prop]
if(typeof value != 'string'){
throw new EnumError(value)
}
this.map[prop] = value
Object.defineProperty(this, prop, { value });
}
}
Object.defineProperty(this, 'values', { value: Object.values(this.map) });
}
isValid(text: any) {
if (!text) return true
return this.values.includes(text)
}
}
关键是,如果我将构造函数中使用的对象复制 4 次,它甚至会告诉我 FolderVisibility.values 的类型是 'public' | 'private'
PS:我已经尝试过了,但它会给我string 为FolderVisibility.values。此外,它仍然很长。
常量数据 = {
公共:'公共',
私人:'私人'
}
const FolderVisibility = new Enum<typeof data>(data) as Enum<typeof data> & typeof data
【问题讨论】:
-
你为什么不能只使用一个简单的打字稿枚举
enum FolderVisibilityEnum { PUBLIC = 'public', PRIVATE = 'private' }?您可以为枚举创建这些方法,它看起来会更好.. -
我们有多个枚举,它们都共享同一个类,因此使用相同的函数似乎是合适的。另外,如果添加枚举不需要太多努力,那就太好了。
-
第二个好处是可以更好地学习如何在 TS 中使用泛型类型。有这么多功能,但很难找到它们的教程
标签: typescript enums typescript-generics