Как динамически вызывать метод в AWS -SDK с использованием TypeScript? - PullRequest
0 голосов
/ 09 апреля 2020

Я конвертирую код JS в TypeScript (немного изменен, чтобы создать более минимальный пример , переменная типа более сложная, но дело в том, что это переменная Dynami c с тип "transactGetItems" | "transactWriteItems").

import {DynamoDB} from "aws-sdk";
const ddb = new DynamoDB();

let type: "transactGetItems" | "transactWriteItems" = Math.random() < .5 ? "transactGetItems" : "transactWriteItems";

const result = await ddb[type](transactionParams).promise();
return result.Responses ? await Promise.all(result.Responses.map((item, index: number) => {
    return processItem(item.Item);
})) : null;

Я получаю следующую ошибку, хотя:

Ошибка TS2349: Это выражение не вызывается. Каждый член типа объединения '{(params: TransactGetItemsInput, callback ?: (err: AWSError, data: TransactGetItemsOutput) => void): Request; (обратный вызов ?: (err: AWSError, data: TransactGetItemsOutput) => void): Request <...>; } | {...; } 'имеет подписи, но ни одна из этих подписей не совместима друг с другом.

enter image description here

Теперь, если я сделаю следующее, это сработает:

const a = await aws.ddb()["transactWriteItems"](transactionParams).promise();
const b = await aws.ddb()["transactGetItems"](transactionParams).promise();

НО, единственная причина, по которой я хочу сделать это, заключается в том, что и transactGetItems, и transactWriteItems невероятно похожи с точки зрения ввода и вывода.

Это работало в JavaScript просто отлично.

Есть ли какая-то хитрость, чтобы заставить это работать правильно в TypeScript, чтобы я мог сохранить свой код DRY и не повторять его? Я знаю, что есть способы сделать это более повторяющимися, но основная цель здесь - сохранить код DRY и минимальный.

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