Сделать интерфейс, содержащий детей, указанных enum в Typescript - PullRequest
0 голосов
/ 16 февраля 2020

Скажем, у меня есть словарь поведений, в моем конкретном случае 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
};

, но, конечно, это вызвало синтаксическую ошибку.

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

Извините за количество слов. Я ценю помощь.

1 Ответ

0 голосов
/ 16 февраля 2020

Вы имели в виду что-то вроде этого:

enum SortMethod {
    alphabetical,
    counterAlphabetical,
    // oldest,
    // newes
};

type SortFN<T> = (a: T, b: T) => T;
type SortMethods<T> = Record<SortMethod, SortFN<T>>

const numericSortMethods: SortMethods<number> = {
    [SortMethod.alphabetical]: (a, b) => {
        return a > b ? a : b
    },
    [SortMethod.counterAlphabetical]: (a, b) => {
        return b > a ? a : b
    }
};

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