为没有共同点的类型的联合编写类型保护的类型安全方法是什么?

时间:2019-02-25 17:52:29

标签: typescript

我正在使用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属性。

1 个答案:

答案 0 :(得分:1)

好吧,当我在这里橡胶教学时,我想起了使用技巧。我可以扩大函数内部的类型以使签名保持所需的方式:

function isError(respOrError: PouchResponse | PouchError): respOrError is PouchError {
    const wide: Partial<PouchResponse & PouchError> = respOrError;
    return !wide.ok;
}