@@ -174,37 +174,80 @@ export const extendsGetter = <T extends object>(
174174} ;
175175
176176export interface FuncCatch {
177- < E = unknown , F extends Func = Func > ( fn : F , errorParser ?: ( err : unknown ) => E ) : FuncCatchWrapper < E , F > ;
177+ < E = unknown , F extends Func = Func > ( fn : F , errorParser ?: ( err : unknown ) => E ) : FuncCatch . Wrapper < E , F > ;
178+ wrapSuccess : < R > ( resule : R ) => FuncCatch . SuccessReturn < R > ;
179+ wrapError : < E > ( err : E , errorParser ?: ( err : unknown ) => E ) => FuncCatch . ErrorReturn < E > ;
178180}
179- export type FuncCatchWrapper < E , F extends Func > =
180- & Func <
181- ThisParameterType < F > ,
182- Parameters < F > ,
183- FuncCatchReturn < E , ReturnType < F > >
184- >
185- & {
186- catchType < E > ( errorParser ?: ( err : unknown ) => E ) : FuncCatchWrapper < E , F > ;
181+ export namespace FuncCatch {
182+ export type Wrapper < E , F extends Func > =
183+ & Func <
184+ ThisParameterType < F > ,
185+ Parameters < F > ,
186+ Return < E , ReturnType < F > >
187+ >
188+ & {
189+ catchType < E > ( errorParser ?: ( err : unknown ) => E ) : Wrapper < E , F > ;
190+ } ;
191+ export type SuccessReturn < R > = readonly [ undefined , R ] & {
192+ readonly success : true ;
193+ readonly result : R ;
194+ readonly error : void ;
195+ } ;
196+ export type ErrorReturn < E > = readonly [ E , undefined ] & {
197+ readonly success : false ;
198+ readonly result : void ;
199+ readonly error : E ;
187200 } ;
188- export type FuncCatchReturn < E , R > = R extends PromiseLike < infer R > ? PromiseLike < [ E , undefined ] | [ undefined , R ] >
189- : [ E , undefined ] | [ undefined , R ] ;
201+ export type Return < E , R > = [ R ] extends [ never ] ? ErrorReturn < E >
202+ : R extends PromiseLike < infer T > ? PromiseLike < SuccessReturn < T > | ErrorReturn < E > >
203+ : SuccessReturn < R > | ErrorReturn < E > ;
204+ }
205+
206+ const wrapSuccess = < R > ( result : R ) : FuncCatch . SuccessReturn < R > => {
207+ return Object . defineProperties (
208+ [ undefined , result ] as const ,
209+ {
210+ success : { value : true , writable : false , enumerable : false , configurable : true } ,
211+ result : { value : result , writable : false , enumerable : false , configurable : true } ,
212+ error : { value : undefined , writable : false , enumerable : false , configurable : true } ,
213+ } as const ,
214+ ) as FuncCatch . SuccessReturn < R > ;
215+ } ;
216+ const wrapError = < E > ( err : E , errorParser ?: ( err : unknown ) => E ) : FuncCatch . ErrorReturn < E > => {
217+ const error = errorParser ? errorParser ( err ) : err as E ;
218+ return Object . defineProperties (
219+ [ error , undefined ] as const ,
220+ {
221+ success : { value : false , writable : false , enumerable : false , configurable : true } ,
222+ result : { value : undefined , writable : false , enumerable : false , configurable : true } ,
223+ error : { value : error , writable : false , enumerable : false , configurable : true } ,
224+ } as const ,
225+ ) as FuncCatch . ErrorReturn < E > ;
226+ } ;
190227/** 包裹一个函数,并对其进行错误捕捉并返回 */
191- export const func_catch : FuncCatch = < E = unknown , F extends Func = Func > ( fn : F , errorParser ?: ( err : unknown ) => E ) => {
192- return Object . assign ( function ( this : ThisParameterType < F > ) {
193- try {
194- const res : ReturnType < F > = fn . apply ( this , arguments as any ) ;
195- if ( isPromiseLike ( res ) ) {
196- return res . then (
197- ( value : unknown ) => [ undefined , value ] ,
198- ( err : unknown ) => [ errorParser ? errorParser ( err ) : err as E , undefined ] ,
199- ) ;
228+ export const func_catch : FuncCatch = Object . assign (
229+ < E = unknown , F extends Func = Func > ( fn : F , errorParser ?: ( err : unknown ) => E ) => {
230+ return Object . assign ( function ( this : ThisParameterType < F > ) {
231+ try {
232+ const res : ReturnType < F > = fn . apply ( this , arguments as any ) ;
233+ if ( isPromiseLike ( res ) ) {
234+ return res . then (
235+ ( value : unknown ) => wrapSuccess ( value ) ,
236+ ( err : unknown ) => wrapError ( err , errorParser ) ,
237+ ) ;
238+ }
239+ return wrapSuccess ( res ) ;
240+ } catch ( err ) {
241+ return wrapError ( err , errorParser ) ;
200242 }
201- return [ undefined , res ] ;
202- } catch ( err ) {
203- return [ errorParser ? errorParser ( err ) : err as E , undefined ] ;
204- }
205- } , {
206- catchType < E > ( errorParser ?: ( err : unknown ) => E ) {
207- return func_catch ( fn , errorParser ) ;
208- } ,
209- } ) as FuncCatchWrapper < E , F > ;
210- } ;
243+ } , {
244+ catchType < E > ( errorParser ?: ( err : unknown ) => E ) {
245+ return func_catch ( fn , errorParser ) ;
246+ } ,
247+ } ) ;
248+ } ,
249+ {
250+ wrapSuccess,
251+ wrapError,
252+ } ,
253+ ) ;
0 commit comments