我正在使用PouchDB,它将返回一系列可能混合的成功响应或批量操作错误。
成功响应应该始终在其中将字段ok
设置为true
,而错误响应可能包含一堆所有可选字段。
我想从中筛选出所有错误,但无法找出能为我缩小范围的理智的类型后卫。
直接的方法是:
interface PouchResponse {
ok: boolean;
}
interface PouchError {
status?: number;
reason?: string;
}
function isError(
respOrError:
| PouchResponse
| PouchError)
: respOrError is PouchError {
return !respOrError.ok;
}
但这在ok
中不存在的PouchResponse | PouchError
处中断。鉴于类型交集如何工作,这确实有意义,但我的目的是检查该属性是否存在,如果存在,则为true
。
我可以将签名更改为:
function isError(respOrError: Partial<PouchResponse & PouchError>): respOrError is PouchError
但这并不完全正确,因为它不能真正反映该功能的功能:区分一个并集。
不能将任何其他随机对象传递给此函数,并使其仅将其缩小到PouchError
,因为它没有ok
属性。
答案 0 :(得分:1)
好吧,当我在这里橡胶教学时,我想起了使用技巧。我可以扩大函数内部的类型以使签名保持所需的方式:
function isError(respOrError: PouchResponse | PouchError): respOrError is PouchError {
const wide: Partial<PouchResponse & PouchError> = respOrError;
return !wide.ok;
}