Скажем, у меня есть словарь поведений, в моем конкретном случае c это словарь функций сортировки.
Я хочу передать одну функцию, которая идет вперед и фактически выполняет сортировку. Для этого я объявляю Enum, содержащий возможные методы сортировки. В моем конкретном случае c у меня есть алфавитный, встречный алфавитный, самый старый, самый новый и целый ряд других. Поэтому, если я хочу экспортировать набор функций, мне нужен объект, расширяющий это перечисление. Однако из некоторых быстрых тестов кода я не смог найти какой-либо метод ограничения объекта в перечислении и все же указания на тот факт, что каждый элемент в этом перечислении является функцией.
Примите это как пример:
enum sorts {
alphabetical,
counterAlphabetical,
oldest,
newes
...
}
И у меня есть объект, определяющий эти функции:
const SortingFunctions: sorts = {
alphabetical: (i: SampleObject, j: SampleObject): SampleObject => // implement function
}
Затем я получаю ошибку:
TS2322: Тип '{ алфавитный: (i: SampleObject, j: SampleObject) => SampleObject} 'нельзя назначить типу' SampleObjectFilter '.
Так что если я хочу сказать машинописи, что каждая запись в этом перечислении следует за определенным подпись, я могу либо заставить пользователя передать правильный элемент из объекта SortingFunctions
(объект с реализациями), либо я могу получить функцию распознавателя для разрешения правильной функции сортировки на основе входного значения, которое было первоначально указано над перечисление
function sort(sortingMethod: sorts): SampleObject[] {
return SortingFunctions[sortingMethod](SampleObjects); // Some Sorting algorithm implementation, that's irrelevant
}
Какой метод объявления объекта я считаю предпочтительным, так как использование метода объявления переменных приведет к тому, что типы не будут определены явно.
Так или иначе, я попытался объявить SortingFunctions
объект как объект, содержащий ключи перечисления sorts
, например:
const SortingFunctions: {
[Algorithm as keyof sorts: string]: (i: SampleObject, j: SampleObject) => SampleObject
} = {
// implementations
};
, но, конечно, это вызвало синтаксическую ошибку.
В любом случае, вопрос в том, возможно ли используйте перечисление, чтобы объявить свойства словаря функций таким образом, чтобы компилятор знал, что он ссылается на перечисление, если такое использование произойдет.
Извините за количество слов. Я ценю помощь.