Как типизировать объект Error и Error cause?
Помогите типизировать объект ошибки и Error cause в замороченной функции.
TypeScript ругается в этом месте:
throw new Error(
FETCH_ERROR_MESSAGE,
{ cause: { status: response.status } }
);
}
Текст ошибки:
Type '{ status: number; }' is not assignable to type 'Error'. Object literal may only specify known properties, and 'status' does not exist in type 'Error'.
Как/где указать тип cause? Непонятно от слова совсем как расширить тип Error.
Вторая ошибка в блоке catch. Я хочу указать там тип например Error но Typescript ругается и пишет:
Catch clause variable type annotation must be 'any' or 'unknown' if specified.
Поэтому я указал там any, но хочется типизировать.
Функция:
async fetchProducts({ commit, dispatch }, attempt: number = 1) {
try {
commit(MutationTypes.SET_IS_LOADING, true);
const response = await fetch(BASE_URL);
if (!response.ok) {
await wait(1000);
throw new Error(
FETCH_ERROR_MESSAGE,
{ cause: { status: response.status } }
);
}
const products: Product[] = await response.json();
commit(MutationTypes.SET_PRODUCTS, products);
} catch (e: any) {
commit(MutationTypes.SET_IS_LOADING, false);
if (attempt <= FETCH_ATTEMPTS_COUNT) {
commit(MutationTypes.SET_ERROR, {
isError: true,
message: e.message,
errorCode: e.cause.status,
timeout: attempt * (FETCH_DELAY_REQUEST_MS / 1000),
});
await wait(attempt * FETCH_DELAY_REQUEST_MS);
return dispatch('fetchProducts', attempt + 1);
}
commit(MutationTypes.SET_SERVER_STATUS, { isDown: true, message: SERVER_ERROR_MESSAGE });
} finally {
commit(MutationTypes.SET_IS_LOADING, false);
}
},
Ответы (1 шт):
Ну во первых у Error либо 0 либо 1 аргумент и он должен быть строкой. Во вторых вы можете просто выкинуть свой кастомный объект, наприммер так:
type MyErrorBody = {
cause: {
status: string
}
}
class MyError {
#errorText: string;
#errorBody: MyErrorBody;
constructor(errorText: string, errorBody: MyErrorBody) {
this.#errorText = errorText;
this.#errorBody = errorBody;
}
get errorText(): string {
return this.#errorText;
}
get errorBody(): MyErrorBody {
return this.#errorBody;
}
}
try {
throw new MyError('Error text', {
cause: {
status: 'Bad request'
}
});
} catch(e) {
const error: MyError = e as MyError;
console.log(error.errorBody.cause.status); // "Bad request"
}