Предлагать дочерние типы TypeScript Object и Array - PullRequest
0 голосов
/ 01 апреля 2020

Я хочу иметь функцию, которая возвращает дочерние элементы любой коллекции в хранилище в стиле редукса в 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

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

...