![](/img/trans.png)
[英]Why Typescript can't infer type when you assign a return typed method's output to a variable?
[英]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.