Я конвертирую код 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 <...>; } | {...; } 'имеет подписи, но ни одна из этих подписей не совместима друг с другом.
Теперь, если я сделаю следующее, это сработает:
const a = await aws.ddb()["transactWriteItems"](transactionParams).promise();
const b = await aws.ddb()["transactGetItems"](transactionParams).promise();
НО, единственная причина, по которой я хочу сделать это, заключается в том, что и transactGetItems
, и transactWriteItems
невероятно похожи с точки зрения ввода и вывода.
Это работало в JavaScript просто отлично.
Есть ли какая-то хитрость, чтобы заставить это работать правильно в TypeScript, чтобы я мог сохранить свой код DRY и не повторять его? Я знаю, что есть способы сделать это более повторяющимися, но основная цель здесь - сохранить код DRY и минимальный.