Тип отказа от подписки
Как установить тип отказа от моего обещания? Скажем так:
const start = (): Promise<string> => {
return new Promise((resolve, reject) => {
if (someCondition) {
resolve('correct!');
} else {
reject(-1);
}
});
}
Скажем, я хочу отклонить число. Но я не могу установить тип; Я могу передать, что я хочу на reject
здесь.
Более того, при использовании этого обещания, я хочу, чтобы компилировать ошибку, если я неправильно использую тип ответа отклонения.
Ответы
Ответ 1
Как объясняется в этом выпуске, Promise
не имеет разных типов для выполнения и отклоненных обещаний. reject
принимает any
аргументы, которые не влияют на тип обещания.
В настоящее время Promise
не может быть напечатано лучше. Это связанно с тем, что обещание может быть отвергнуто throw
ИНГАМИ внутри then
или catch
(это предпочтительный способ отказаться от существующего обещания), и это не может быть обработано путем ввода системы; Кроме того, TypeScript также не имеет типов, специфичных для исключения, за исключением never
.
Ответ 2
Исключение типизируется любым, потому что мы не можем гарантировать правильный тип исключения во время разработки, и ни TypeScript, ни JavaScript не обеспечивают возможность защиты типов исключений во время выполнения. Лучший вариант - использовать средства защиты типов для проверки кода во время разработки и во время выполнения.
источник
Ответ 3
То, что @EstusFlask упомянул в его ответе, является правильным.
Но я хочу пойти на шаг ближе к искусственному решению, чтобы имитируйте то, что нам нужно, с возможностями TypeScript
.
Иногда я использую этот шаблон в своих кодах😉:
interface IMyEx{
errorId:number;
}
class MyEx implements IMyEx{
errorId:number;
constructor(errorId:number) {
this.errorId = errorId;
}
}
// -------------------------------------------------------
var prom = new Promise(function(resolve, reject) {
try {
if(..........)
resolve('Huuuraaa');
else
reject(new MyEx(100));
}
catch (error) {
reject(new MyEx(101));
}
});
// -------------------------------------------------------
prom()
.then(success => {
try {
}
catch (error) {
throw new MyEx(102);
}
})
.catch(reason=>{
const myEx = reason as IMyEx;
if (myEx && myEx.errorId) {
console.log('known error', myEx)
}else{
console.log('unknown error', reason)
}
})