/** * Todo createErrorType会动态创建类,对象codes暂时不清楚如何定义,临时方案声明CustomError,跟createErrorType动态创建的类保持一致 * */ export class ShadowError { message: string; code: string; name: string; constructor(..._args) {/**/} } interface CreateErrorTypeOptions { message: string | ((...args) => string); Base?: typeof Error; } const getErrorMessage = (message: CreateErrorTypeOptions['message'], ...args): string => { if (typeof message === 'function') { return message(...args); } return message; } const codes: { [key: string]: typeof ShadowError; } = {}; const createErrorType = (code: string, { message, Base, }: CreateErrorTypeOptions) => { if (!Base) { Base = Error; } class NodeError extends Base { constructor(...args) { super(getErrorMessage(message, ...args)); } } NodeError.prototype.name = Base.name; // @ts-ignore NodeError.prototype.code = code; // @ts-ignore codes[code] = NodeError; } createErrorType('ERR_INVALID_OPT_VALUE', { message(name, value) { return `The value ${value} is invalid for option ${name}`; }, Base: TypeError }); createErrorType('ERR_INVALID_ARG', { message(name, type) { return `The type '${type}' is invalid for arg '${name}'`; }, Base: TypeError }); createErrorType('ERR_METHOD_NOT_IMPLEMENTED', { message(name) { return `The ${name} method is not implemented`; }, }); createErrorType('ERR_INVALID_FORMAT', { message: 'invalid instance. Did you use method format to create a Format instance?', Base: TypeError }); export default codes;