Вы не можете изменить тип ошибки с текущим определением типа.Тип ошибки всегда any
.Это очевидно, если взглянуть на определение catch
:
catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | undefined | null): Promise<T | TResult>;
Аргумент reason
обратного вызова onrejected
равен any
.
. Вы можете использовать логический тип литерала.true
для представления того факта, что значение может быть только истинным
const myFunc = (value: boolean): Promise<true> => {
return new Promise((resolve, reject) => {
if (!value) {
reject(new Error("error msg"));
return;
}
resolve(true);
});
};
myFunc(true)
.then(r=> r) // r is typed as true
Один из обходных путей, хотя и не слишком удачный, заключается в использовании результата обещания как для ошибок, так и для случаев успеха.
const myFunc = (value: boolean): Promise<true | Error> => {
return new Promise((resolve, reject) => {
if (!value) {
resolve(new Error("error msg"));
return;
}
resolve(true);
});
};
myFunc(true)
.then(r => // r true | Error
{
if(r === true){
r // r is true
}else{
r.message // r is Error
}
})