Тип подсказки Ответ на обещание с 2 возможными значениями - PullRequest
0 голосов
/ 04 мая 2020

У меня есть следующее определение функции TypeScript:

export const handler = async (): Promise<LambdaOutput | DCDErrorResponse> => {
 const result1: Promise<LambdaOutput> = await func1();
 const result2: Promise<DCDErrorResponse> = await func2();

 return someMagicalCondition() ? result1 : result2;
};

Другой фрагмент кода импортирует handler() и выполняет его:

const result = await handler();
console.log(result.upload); // <-- fail to access attributes, available in the LambdaOutput type but not in the other possible return type of the Promise

Проблема заключается в том, что всякий раз, когда я пытаюсь получить доступ В последнем примере result.upload (свойство доступно только в LambdaOutput, но не в DCDErrorResponse), компилятор TypeScript жалуется на следующее:

TS2339: свойство «upload» не существует для типа «LambdaOutput» | DCDErrorResponse. Свойство upload не существует для типа DCDErrorResponse.

1 Ответ

1 голос
/ 04 мая 2020

Поскольку возвращаемое значение может быть нескольких типов данных, вы должны убедиться, что это именно тот тип, который вам действительно нужен, прежде чем начинать обрабатывать его как один из этих типов. В этом случае вы сможете проверить, существует ли это свойство. Затем Typescript может зафиксировать правильный тип в этой ветви кода.

const result = await handler();
if ('upload' in result) {
   // Typescript knows result is a LambdaOutput here
   console.log(result.upload);
}

Playground

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