Я пытаюсь использовать обобщенные значения в 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
разрешены правильно и имеют соответствующие типы.