diff --git a/index.d.ts b/index.d.ts index 5ea0be90af..c74e93ca92 100644 --- a/index.d.ts +++ b/index.d.ts @@ -153,6 +153,7 @@ export interface AxiosStatic extends AxiosInstance { isCancel(value: any): boolean; all(values: (T | Promise)[]): Promise; spread(callback: (...args: T[]) => R): (array: T[]) => R; + isAxiosError(payload: any): payload is AxiosError; } declare const axios: AxiosStatic; diff --git a/lib/axios.js b/lib/axios.js index 8142437983..c6357b0055 100644 --- a/lib/axios.js +++ b/lib/axios.js @@ -47,6 +47,9 @@ axios.all = function all(promises) { }; axios.spread = require('./helpers/spread'); +// Expose isAxiosError +axios.isAxiosError = require('./helpers/isAxiosError'); + module.exports = axios; // Allow use of default import syntax in TypeScript diff --git a/lib/helpers/isAxiosError.js b/lib/helpers/isAxiosError.js new file mode 100644 index 0000000000..29ff41af8b --- /dev/null +++ b/lib/helpers/isAxiosError.js @@ -0,0 +1,11 @@ +'use strict'; + +/** + * Determines whether the payload is an error thrown by Axios + * + * @param {*} payload The value to test + * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false + */ +module.exports = function isAxiosError(payload) { + return (typeof payload === 'object') && (payload.isAxiosError === true); +}; diff --git a/test/specs/api.spec.js b/test/specs/api.spec.js index 1a09cf7ce6..eaeadfa2d7 100644 --- a/test/specs/api.spec.js +++ b/test/specs/api.spec.js @@ -41,6 +41,10 @@ describe('static api', function () { expect(typeof axios.CancelToken).toEqual('function'); expect(typeof axios.isCancel).toEqual('function'); }); + + it('should have isAxiosError properties', function () { + expect(typeof axios.isAxiosError).toEqual('function'); + }); }); describe('instance api', function () { diff --git a/test/specs/helpers/isAxiosError.spec.js b/test/specs/helpers/isAxiosError.spec.js new file mode 100644 index 0000000000..7aeef85f53 --- /dev/null +++ b/test/specs/helpers/isAxiosError.spec.js @@ -0,0 +1,20 @@ +var createError = require('../../../lib/core/createError'); +var enhanceError = require('../../../lib/core/enhanceError'); +var isAxiosError = require('../../../lib/helpers/isAxiosError'); + +describe('helpers::isAxiosError', function () { + it('should return true if the error is created by core::createError', function () { + expect(isAxiosError(createError('Boom!', { foo: 'bar' }))) + .toBe(true); + }); + + it('should return true if the error is enhanced by core::enhanceError', function () { + expect(isAxiosError(enhanceError(new Error('Boom!'), { foo: 'bar' }))) + .toBe(true); + }); + + it('should return false if the error is a normal Error instance', function () { + expect(isAxiosError(new Error('Boom!'))) + .toBe(false); + }); +}); diff --git a/test/specs/instance.spec.js b/test/specs/instance.spec.js index 5224df299c..bd9e9fbd62 100644 --- a/test/specs/instance.spec.js +++ b/test/specs/instance.spec.js @@ -19,6 +19,7 @@ describe('instance', function () { 'isCancel', 'all', 'spread', + 'isAxiosError', 'default'].indexOf(prop) > -1) { continue; } diff --git a/test/typescript/axios.ts b/test/typescript/axios.ts index c244cb1aa7..1a1b6a7645 100644 --- a/test/typescript/axios.ts +++ b/test/typescript/axios.ts @@ -358,3 +358,12 @@ axios.get('/user', { }); source.cancel('Operation has been canceled.'); + +// AxiosError + +axios.get('/user') + .catch((error) => { + if (axios.isAxiosError(error)) { + const axiosError: AxiosError = error; + } + });