Я хочу иметь функцию, которая возвращает дочерние элементы любой коллекции в хранилище в стиле редукса в TypeScript. Коллекция может быть объектом или массивом. Я также хочу объявить мой тип функции безопасным с использованием обобщений, так что он выводит тип (типы) дочерних элементов в качестве возвращаемого типа функции.
Возьмите упрощенный пример ниже. Магазин выглядит следующим образом:
interface MessageStore {
readonly messages: Message[];
readonly messagesById: { [id: string]: Message };
}
И объявление функции generi c выглядит следующим образом:
function getMessages<S extends keyof MessageStore, T extends MessageStore[S]>(
path: S
): T[keyof T][];
При доступе к messagesById
и messages
я хочу сделать вывод тип возвращаемого значения Message[]
. При доступе к messagesById
(Object
) это действительно так. Однако при доступе к messages
(Array
) выводимый тип возврата является сложным типом объединения, которого я не ожидал.
// Correctly infers `Message[]` as the result type when accessing an object
const fromObject = getMessages("messagesById");
// Infers a complex union type as the result when accessing an array
// What is going wrong here?
const fromArray = getMessages("messages");
Рабочий пример для StackBlitz
Я ожидаю, что мое объявление функции должно быть другим, но я не понимаю, как мне его изменить. Любые предложения будут высоко оценены!