если есть более простой способ записать это, так как это очень часто повторяется и кажется очень неправильным ...
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 data = {PUBLIC: 'public', PRIVATE: 'private'}
const FolderVisibility = new Enum<typeof data>(data) as Enum<typeof data> & typeof data
enum FolderVisibilityEnum { PUBLIC = 'public', PRIVATE = 'private' }
? Вы можете создать эти методы для перечисления, и это будет выглядеть лучше .. - person Titian Cernicova-Dragomir   schedule 18.04.2018