From 61337a9bbe100cdab9e175f8ee42e4d5d2ba6842 Mon Sep 17 00:00:00 2001 From: zjx0905 <954270063@qq.com> Date: Wed, 5 Apr 2023 13:31:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=96=B0=E7=9A=84=20?= =?UTF-8?q?API=20isAxiosError?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/adapter.ts | 3 +-- src/axios.ts | 9 ++++++--- src/core/Axios.ts | 3 ++- src/core/createError.ts | 6 ++++-- src/core/request.ts | 9 +++++++-- test/axios.api.test.ts | 7 +++++-- test/core/createError.test.ts | 9 +++++++-- 7 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/adapter.ts b/src/adapter.ts index d7c05a4..7b01f0d 100644 --- a/src/adapter.ts +++ b/src/adapter.ts @@ -10,7 +10,6 @@ import { AxiosRequestFormData, AxiosRequestHeaders, AxiosResponse, - AxiosResponseError, } from './core/Axios'; export type AxiosAdapterRequestType = 'request' | 'download' | 'upload'; @@ -267,7 +266,7 @@ export function createAdapter(platform: AxiosPlatform): AxiosAdapter { transformResult(response); config.success(response); }, - fail(error: AxiosResponseError): void { + fail(error: AxiosAdapterResponseError): void { transformResult(error); config.fail(error); }, diff --git a/src/axios.ts b/src/axios.ts index 90a282e..0d9ff11 100644 --- a/src/axios.ts +++ b/src/axios.ts @@ -1,4 +1,4 @@ -import { AxiosAdapter, createAdapter, AxiosPlatform } from './adapter'; +import { isString } from './helpers/isTypes'; import Axios, { AxiosConstructor, AxiosRequestConfig, @@ -6,8 +6,9 @@ import Axios, { AxiosResponse, } from './core/Axios'; import { CancelToken, CancelTokenConstructor, isCancel } from './core/cancel'; +import { isAxiosError } from './core/createError'; import { mergeConfig } from './core/mergeConfig'; -import { isString } from './helpers/isTypes'; +import { AxiosAdapter, createAdapter, AxiosPlatform } from './adapter'; import defaults from './defaults'; export interface AxiosInstanceDefaults extends AxiosRequestHeaders { @@ -27,7 +28,8 @@ export interface AxiosStatic extends AxiosInstance { CancelToken: CancelTokenConstructor; create(defaults?: AxiosRequestConfig): AxiosInstance; createAdapter(platform: AxiosPlatform): AxiosAdapter; - isCancel(value: unknown): boolean; + isCancel: typeof isCancel; + isAxiosError: typeof isAxiosError; } function createInstance(defaults: AxiosRequestConfig): AxiosInstance { @@ -61,5 +63,6 @@ axios.create = function create(defaults: AxiosRequestConfig): AxiosInstance { }; axios.createAdapter = createAdapter; axios.isCancel = isCancel; +axios.isAxiosError = isAxiosError; export default axios; diff --git a/src/core/Axios.ts b/src/core/Axios.ts index 697d7e7..59187ce 100644 --- a/src/core/Axios.ts +++ b/src/core/Axios.ts @@ -5,8 +5,8 @@ import { AxiosAdapterRequestMethod, AxiosAdapterTask, AxiosAdapterResponse, - AxiosAdapterResponseError, AxiosAdapterRequestConfig, + AxiosAdapterResponseError, } from '../adapter'; import { CancelToken } from './cancel'; import dispatchRequest from './dispatchRequest'; @@ -130,6 +130,7 @@ export interface AxiosResponse } export interface AxiosResponseError extends AxiosAdapterResponseError { + isFail: true; config?: AxiosRequestConfig; request?: AxiosAdapterTask; } diff --git a/src/core/createError.ts b/src/core/createError.ts index 02e1d3f..92fd77c 100644 --- a/src/core/createError.ts +++ b/src/core/createError.ts @@ -5,8 +5,6 @@ import { AxiosRequestConfig, AxiosResponse, AxiosResponseError } from './Axios'; export type AxiosErrorResponse = AxiosResponse | AxiosResponseError; class AxiosError extends Error { - public isAxiosError = true; - public config: AxiosRequestConfig; public request?: AxiosAdapterTask; @@ -39,3 +37,7 @@ export function createError( cleanStack(axiosError); return axiosError; } + +export function isAxiosError(value: unknown): value is AxiosError { + return value instanceof AxiosError; +} diff --git a/src/core/request.ts b/src/core/request.ts index 44cfef5..79dd41d 100644 --- a/src/core/request.ts +++ b/src/core/request.ts @@ -3,6 +3,8 @@ import { assert } from '../helpers/error'; import { AxiosAdapterRequestConfig, AxiosAdapterRequestMethod, + AxiosAdapterResponse, + AxiosAdapterResponseError, AxiosAdapterTask, } from '../adapter'; import { @@ -58,7 +60,8 @@ export function request( | AxiosAdapterTask | undefined; - function success(response: AxiosResponse): void { + function success(_: AxiosAdapterResponse): void { + const response = _ as AxiosResponse; response.config = config; response.request = adapterTask; if ( @@ -71,7 +74,9 @@ export function request( } } - function fail(error: AxiosResponseError): void { + function fail(_: AxiosAdapterResponseError): void { + const error = _ as AxiosResponseError; + error.isFail = true; error.config = config; error.request = adapterTask; catchError('网络错误', error); diff --git a/test/axios.api.test.ts b/test/axios.api.test.ts index bea1580..d9f5b9d 100644 --- a/test/axios.api.test.ts +++ b/test/axios.api.test.ts @@ -1,7 +1,8 @@ import { describe, test, expect, beforeAll, afterAll } from 'vitest'; import { mockAdapter } from 'scripts/test.utils'; import Axios from '../src/core/Axios'; -import { CancelToken } from '../src/core/cancel'; +import { CancelToken, isCancel } from '../src/core/cancel'; +import { isAxiosError } from '../src/core/createError'; import { createAdapter } from '../src/adapter'; import defaults from '../src/defaults'; import axios from '../src/axios'; @@ -24,11 +25,13 @@ describe('src/axios.ts', () => { expect(axios.Axios).toBe(Axios); expect(axios.CancelToken).toBe(CancelToken); expect(axios.createAdapter).toBe(createAdapter); + expect(axios.isCancel).toBe(isCancel); + expect(axios.isAxiosError).toBe(isAxiosError); expect(axios.interceptors).toBeTypeOf('object'); expect(axios.create).toBeTypeOf('function'); expect(axios.request).toBeTypeOf('function'); - expect(axios.isCancel).toBeTypeOf('function'); + expect(axios.getUri).toBeTypeOf('function'); [...Axios.as, ...Axios.pas, ...Axios.das].forEach((k) => { diff --git a/test/core/createError.test.ts b/test/core/createError.test.ts index cad20e4..8944b30 100644 --- a/test/core/createError.test.ts +++ b/test/core/createError.test.ts @@ -1,13 +1,12 @@ import { describe, test, expect } from 'vitest'; import { checkStack } from 'scripts/test.utils'; -import { createError } from 'src/core/createError'; +import { createError, isAxiosError } from 'src/core/createError'; describe('src/core/createError.ts', () => { test('应该支持空参数', () => { const c = {}; const err = createError('error', c); - expect(err.isAxiosError).toBeTruthy(); expect(err.message).toBe('error'); expect(err.config).toBe(c); expect(checkStack(err)).toBeTruthy(); @@ -24,4 +23,10 @@ describe('src/core/createError.ts', () => { expect(err.request).toBe(req); expect(err.response).toBe(res); }); + + test('应该正确判断 AxiosError', () => { + expect(isAxiosError(0)).toBeFalsy(); + expect(isAxiosError(new Error())).toBeFalsy(); + expect(isAxiosError(createError('error', {}))).toBeTruthy(); + }); });