繁体   English   中英

如果返回类型取决于参数,为什么/如何使参数可选?

[英]Why/How can you make a parameter optional if the return type depends on it?

有这部分的英雄,他们做的结果参数可选之旅,但他们使用of RxJS功能嘲笑在return语句的结果类型:

private handleError<T> (operation = 'operation', result?: T) {
  return (error: any): Observable<T> => {

    // TODO: send the error to remote logging infrastructure
    console.error(error); // log to console instead

    // TODO: better job of transforming error for user consumption
    this.log(`${operation} failed: ${error.message}`);

    // Let the app keep running by returning an empty result.
    return of(result as T);
  };
}

来源: https : //angular.io/tutorial/toh-pt6#handleerror

为什么这是一回事? 如果没有结果,这不会最终引发错误吗? 为什么是可选的?

无需担心没有类型可分配给T ,因为如果您不将result传递给handleError ,默认情况下T将是undefined的。 未定义除了值之外还有它自己的类型。


需要注意的一件有趣的事情是handleError实际上并没有创建 observable 本身,而是返回一个函数,每次调用它时都会这样做。

private handleError<T> (operation = 'operation', result?: T) {

    // This function is returned:
    return (error: any): Observable<T> => {
        log(`${operation} failed: ${error.message}`);
        return of(result as T);
    };
}

因此,如果我们通过operation调用handleError ,我们会返回一个函数,我们可以在错误时重复调用该函数,并且它将为每次调用重新使用名称/描述。 这只是一种使用普通函数规范化错误处理的方法。 现在,可选的result开始变得更有意义了。 考虑:

const handler = this.handleError('Fetching stuff');

const err1 = new Error('something went wrong');
const err2 = new Error('something else went wrong');

handler(err1); // "Fetching stuff failed: something went wrong"
handler(err2); // "Fetching stuff failed: something else went wrong"

类似地,我们可以将result值传递给handleError ,该值将被重新用于对返回函数的所有调用。 我认为当从handleError返回的函数在它们创建的类之外使用时,这是最有用的。 这样你就公开了一个函数,该函数返回类已知的固定值的可观察值,可能会通知调用代码处理错误后的附加信息。


更新

查看您提供的链接中的下一个片段,我们可以看到handleError的实际使用方式:

 /** GET heroes from the server */
 getHeroes (): Observable<Hero[]> {
     return this.http.get<Hero[]>(this.heroesUrl)
         .pipe(
             tap(_ => this.log('fetched heroes')),
             catchError(this.handleError<Hero[]>('getHeroes', []))
         );
 }

它表明它被用作失败的 http 请求的错误处理程序。 result是一个空数组,作为getHeroes承诺返回的英雄数组 ( Hero[] ) 的默认值。

以这种方式使用这是一种柯里化技术,可以很好地与可观察的catchError运算符一起使用。 操作员重新使用返回的错误处理程序,并将在可能发生的任何错误时调用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM