import { Toast } from 'antd-mobile' import type { SerializedError } from '@reduxjs/toolkit' import type { FetchBaseQueryError } from '@reduxjs/toolkit/query' /** * Type predicate to narrow an unknown error to `FetchBaseQueryError` */ function isFetchBaseQueryError(error: unknown): error is FetchBaseQueryError { return typeof error === 'object' && error != null && 'status' in error } /** * Type predicate to narrow an unknown error to an object with a string 'message' property */ function isErrorWithMessage(error: unknown): error is { message: string } { return ( typeof error === 'object' && error != null && 'message' in error && typeof (error as { message: string }).message === 'string' ) } export const showError = ( error: string | Error | SerializedError | FetchBaseQueryError ) => { if (typeof error === 'string') { Toast.show({ position: 'top', maskClickable: true, content: error }) } else if (isFetchBaseQueryError(error)) { const _error = error as | { error: string; status: string; result?: number } | { status: number data: { error: string message: string path: string status: number } } if ('data' in _error) { Toast.show({ position: 'top', maskClickable: true, content: `[${_error.data.status}] ${_error.data.path}: ${_error.data.message}` }) } else { Toast.show({ position: 'top', maskClickable: true, content: `[${_error.status}${ _error.result ? `: ${_error.result}` : '' }] ${_error.error || '请求异常'}` }) } } else if (isErrorWithMessage(error)) { Toast.show({ position: 'top', maskClickable: true, content: error.message }) } else { console.log(error) Toast.show({ position: 'top', maskClickable: true, content: `未知的异常` }) } }