代码之家  ›  专栏  ›  技术社区  ›  millimoose Tomasz Nurkiewicz

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

  •  0
  • millimoose Tomasz Nurkiewicz  · 技术社区  · 5 年前

    我正在使用pouchdb,它返回一系列可能混合成功的响应或批量操作错误。

    成功的回应应该有一个字段 ok 设置为 true 在它中,错误响应可能有一堆可选字段。

    我想从中筛选出所有的错误,但无法找到一个理智的守卫来缩小这个范围。

    直接的方法是:

    interface PouchResponse {
        ok: boolean;
    }
    
    interface PouchError {
        status?: number;
        reason?: string;
    }
    
    function isError(
        respOrError:
            | PouchResponse
            | PouchError)
        : respOrError is PouchError {
        return !respOrError.ok;
    }
    

    但那是突然发生的 好啊 不存在于 PouchResponse | PouchError . 考虑到类型交集的工作方式,这是有意义的,但我在这里的目的是检查属性是否存在,以及 如果是这样的话。

    我可以把签名改成:

    function isError(respOrError: Partial<PouchResponse & PouchError>): respOrError is PouchError
    

    但这感觉不太对劲,因为它并不能真正反映函数应该做什么:分离一个联合。不可能将任何其他随机对象传递到该函数中,并将该对象的范围缩小到 PouchError 只是因为它没有 好啊 财产。

    1 回复  |  直到 5 年前
        1
  •  1
  •   millimoose Tomasz Nurkiewicz    5 年前

    好吧,当我在这里做这个的时候,我想起了要使用的技巧;我可以在函数中加宽类型以保持签名的方式:

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