Решение № 1: выдаются ошибки
Я новичок в машинописи
В этом случае я позволю себе переписать вашу magic
функцию с помощью async
и await
, потому что это способ работать в 2019 году:
export async function magic(): Promise<ResultSuccess> {
try {
const response = await fetch('https://jsonplaceholder.typicode.com/todos/1');
const json = await response.json();
return plainToClass(ResultSuccess, json as ResultSuccess);
} catch (err) {
throw plainToClass(ResultError, { error: true });
}
}
Возвращаемое значение - это обещание ResultSuccess
.Функция никогда не возвращает ResultError
, но может выдать ее.Пример того, как его использовать:
async function useMagic() {
try {
const result = await magic();
// 'result' is of type 'ResultSuccess'
} catch (err) {
// 'err' is of type 'any' and you know it is a 'ResultError'
}
}
Решение №2: ошибки не генерируются, а возвращаются
Если вы решите, что ошибки должны быть возвращены как значения результата, вы можете сделать это:
export async function magic2(): Promise<ResultSuccess | ResultError> {
try {
// … same code as previously …
} catch (err) {
return plainToClass(ResultError, { error: true });
}
}
Затем, когда вы используете значение результата, вы должны определить, является ли это ошибкой или успехом.Вот решение:
Напишите type guard :
function isResultError(result: ResultSuccess | ResultError): result is ResultError {
return result["error"] !== undefined;
}
Затем используйте его:
async function useMagic2() {
const result = await magic2();
if (isResultError(result)) {
// Here, 'result' is of type 'ResultError'
} else {
// Here, 'result' is of type 'ResultSuccess'
}
}