Функция вызова Typescript из индекса объекта с универсальным типом - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь использовать обобщенные значения в Typescript таким образом, чтобы обобщенный параметр использовался в качестве индекса для вызова функции, хранящейся в объекте.
Полученная ошибка:

[ts] Невозможно вызвать выражение, тип которого не имеет подписи вызова.Тип '((переменная: {insertId: number;}) => строка) |((переменная: {updateId: номер; значение: строка;}) => строка) |((переменная: {deleteId: число;}) => строка) 'не имеет совместимых подписей вызовов.[2349]

или

Аргумент типа 'QueryInput [T]' нельзя назначить параметру типа '{insertId: number;} & {updateId: number;значение: строка;} & {deleteId: number;}».Тип '{insertId: номер;} |{updateId: номер;значение: строка;} |{deleteId: номер;} 'нельзя назначить для типа' {insertId: number;} & {updateId: number;значение: строка;} & {deleteId: number;}».Тип '{insertId: номер;} 'нельзя назначить для типа' {insertId: number;} & {updateId: number;значение: строка;} & {deleteId: number;}».Тип '{insertId: номер;} 'отсутствуют следующие свойства из типа' {updateId: number;значение: строка;} ': updateId, значение Тип' QueryInput [T] 'нельзя назначить для типа' {insertId: number;}».Тип '{insertId: номер;} |{updateId: номер;значение: строка;} |{deleteId: номер;} 'нельзя назначить для типа' {insertId: number;}».Свойство 'insertId' отсутствует в типе '{updateId: number;значение: строка;} 'но требуется в типе' {insertId: number;} '. ts (2345) App.tsx (7, 13): здесь указывается' insertId '.(параметр) переменные: QueryInput [T]

Вот пример кода, который повторяет проблему:

type Query = "insert" | "update" | "delete";

interface QueryInput {
  insert: { insertId: number };
  update: { updateId: number; value: string };
  delete: { deleteId: number };
}

type QueryObject = { [T in Query]: (variable: QueryInput[T]) => string };

const queries: QueryObject = {
  insert: variable => "insert",
  update: ({ updateId, value }) => "update",
  delete: variable => "delete"
};

const getQuery = <T extends Query>(query: T, variables: QueryInput[T]) => {
  return queries[query](variables); // this line throws an error
}

Кажется, что движок Typescript не может разрешить правильную сигнатуруфункция - хотя определенно возможна только 1 возможная подпись (возвращенная из queries[query]).
Кажется, что query и variables разрешены правильно и имеют соответствующие типы.

1 Ответ

0 голосов
/ 01 апреля 2019

Если вам нужно быстрое грязное решение для компиляции,

const getQuery = <T extends Query>(query: T, variables: QueryInput[T]) => {
  let v: any = variables;
  return queries[query](v); // this line doesnt throw an error
}

Это не идеально, но самому getQuery, похоже, никогда не придется ничего менять. И использование getQuery будет по-прежнему печататься так, как вы хотели с этим решением, только его реализация не.

Пока не найдешь лучшего решения ..

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