如果有更简单的方法来写下来,因为这是非常重复的,而且看起来非常错误......
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'
as 参数无论如何都是只读的。
这是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
此外,它仍然很长。常量数据 = { PUBLIC: 'public', PRIVATE: 'private' }
const FolderVisibility = new Enum<typeof data>(data) as Enum<typeof data> & typeof data