Массив от объявления типа в Angular5 - машинопись - PullRequest
0 голосов
/ 03 июля 2018

То, что я пытаюсь достичь, это массив из типа объявлений.

Используя enum, я могу сделать это так:

export enum Day {
    SU = 'su',
    MO = 'mo',
    TU = 'tu',
    WE = 'we',
    TH = 'th',
    FR = 'fr',
    SA = 'sa',
} 

getDays(): String[] {
    return Object.values(Day);
}

Выход будет ['su', 'mo' etc. ]

Я хочу добиться аналогичного пути из этого:

export declare type WeekDays = 'su' | 'mo' | 'tu' | 'we' | 'th' | 'fr' | 'sa';

с аналогичным выводом как: ['su', 'mo' etc. ]

Есть идеи? Я пробовал Object.entries() и Object.getOwnPropertyNames(). к сожалению, это не работает.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

WeekDays - это просто тип, типы не присутствуют во время выполнения, поэтому мы не можем получить доступ к любой информации, которую тип хранит во время выполнения. Перечисления представляются как объекты во время выполнения, поэтому мы можем извлечь из них информацию. См. здесь для обсуждения типов против значений.

Обналичив преобразование пользовательского компилятора (что означает замену стандартного компилятора пользовательской версией, которая выдает дополнительную информацию), единственное, что мы можем сделать, - это создать функцию для извлечения значений, что требует от нас передачи литерала объекта, который содержит точно строки в перечислении. Хотя это требует от нас пересчета строк, компилятор проверит, что мы не добавляем лишних и не пропускаем, так что это может быть достаточно:

export declare type WeekDays = 'su' | 'mo' | 'tu' | 'we' | 'th' | 'fr' | 'sa';
function getValues<T extends string>(values: { [P in T]: P }) : T[]{
    return Object.values(values);
}
// Ok values are all stated, the values are correctly stated.
getValues<WeekDays>({fr: 'fr',mo: 'mo',sa:'sa',su:'su',th:'th',tu:'tu',we:'we'})
// Error values don't match
getValues<WeekDays>({fr: 'frrr',mo: 'mo',sa:'sa',su:'su',th:'th',tu:'tu',we:'we'})
// Error values missing
getValues<WeekDays>({mo: 'mo',sa:'sa',su:'su',th:'th',tu:'tu',we:'we'})
// Error values extra values
getValues<WeekDays>({funDay: 'funDay', fr: 'fr', mo: 'mo',sa:'sa',su:'su',th:'th',tu:'tu',we:'we'})
0 голосов
/ 03 июля 2018

Все типы в typescrpt являются только метаданными и недоступны во время выполнения. Таким образом, список допустимых строк в вашем строковом литерале не может быть получен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...