【问题标题】:How to narrow down Firestore Field Value如何缩小 Firestore 字段值
【发布时间】:2021-12-12 13:09:51
【问题描述】:

背景:

我正在为 firestore 创建一个类型安全的包装器,该包装器现在可以对每种数据类型和所有操作进行类型安全

包装器:https://www.npmjs.com/package/firelord

==============

问题:

但是,有一种特殊的数据类型我不能安全地键入它,即 Firestore.FieldValue (increment, servertimestamp, arrayunion, arrayremove)

这个东西好像没办法缩小范围,挺郁闷的

我找不到任何解决方案,这让我开始思考人们一直以来是如何处理 FieldValue 的,还是他们只是随意处理它?

我现在想到的当前解决方案是,我创建一个辅助函数,例如,arrayUnion

        const arrayUnion = <T>(value: T) => {
            return firestore.FieldValue.arrayUnion(value) as unknown as T[]
        }

那么它将匹配定义的数据类型。

我认为这应该可行,但是有更好的方法吗?是否可以缩小 Firestore.FieldValue 的范围?

我正在认真寻找一个明智的解决方案,因为这是使我的 Firestore 包装器完全类型安全和可扩展的难题的最后一部分

【问题讨论】:

  • 我相信您在这里唯一的选择是使用帮助函数作为您已经提到的包装器。我真的不认为还有其他方法。

标签: typescript firebase google-cloud-firestore


【解决方案1】:
const increment = (value: number) => {
    return firestore.FieldValue.increment(value) as unknown as {
        'please import `increment` from `firelord` and call it': number
    }
}

const serverTimestamp = () => {
    return firestore.FieldValue.serverTimestamp() as unknown as {
        'please import `serverTimestamp` from `firelord` and call it': 'ServerTimestamp'
    }
}

const arrayUnion = <T>(...values: T[]) => {
    return firestore.FieldValue.arrayUnion(...values) as unknown as {
        'please import `arrayUnion` or `arrayRemove` from `firelord` and call it': T
    }
}
const arrayRemove = <T>(...values: T[]) => {
    return firestore.FieldValue.arrayRemove(...values) as unknown as {
        'please import `arrayUnion` or `arrayRemove` from `firelord` and call it': T
    }
}

我决定采用这个解决方案,类似于我在问题中提出的建议

但是我用看起来很奇怪的对象文字掩盖了它,这是为了防止用户不小心将它用于其他目的

理论上,它不是 100% 安全的,但实际上这应该足够安全

有了这个,我的 firestore 包装器终于完成了,是时候结束 yolo-ing

【讨论】:

    猜你喜欢
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多