Typescript编写Firebase Functions报TS2571 Object is of type unknown错误
报错根因
Firebase Admin SDK 的 once("value") 方法返回的数据库快照,调用 val() 之后默认推导的类型是 unknown,不会自动匹配你自定义的 Tokens 数据结构。
拿到这个类型为unknown的data值后直接传入Object.values(),TypeScript 会自动将遍历得到的value类型推导为unknown,因此访问value.token属性时会触发TS2571: Object is of type 'unknown'的编译报错。
之前尝试直接给map()的value参数标注类型失败,本质是上游的data类型没有被明确界定,下游的类型标注没有可依附的类型基础,TS无法通过这种跨层的类型校验。
正确修复步骤
- 先定义和你实时数据库结构完全匹配的类型接口,明确单个token条目结构:
// 对应/tokens路径下单个条目字段 interface TokenRecord { token: string; } - 在调用
snapshot.val()时,直接将返回值断言为和数据库结构匹配的类型,从源头断开默认的unknown类型推导:
把原代码里的const data = snapshot.val();替换为// /tokens路径是键值对结构:键是TOKENS_ID,值是TokenRecord const data = snapshot.val() as Record<string, TokenRecord>; - 完成这步类型断言后,TS会自动推导
Object.values(data)的返回值为TokenRecord[],map方法里的value参数会自动获得正确的类型,不需要额外手动标注就可以直接访问value.token属性,不会再触发编译报错。
修复后可正常编译的完整代码
export const onBlogPost = functions.database.ref("/blogs/{bid}") .onCreate((blogData) => { console.log(JSON.stringify(blogData.val())); return admin.database().ref("/tokens").once("value") .then((snapshot) => { // 对val()的返回值做明确类型断言 const data = snapshot.val() as Record<string, TokenRecord>; const tokens = Object.values(data).map((value) => { console.log(JSON.stringify(value)); return value.token; }); return console.log(JSON.stringify(tokens)); }); });
额外注意:原代码里的异步调用没有正确return Promise,会导致云函数在异步操作完成前就提前退出,可能出现操作执行不完整的问题。建议在最外层的
admin.database()调用前加上return,保证函数运行时可以正确等待异步流程走完。
内容的提问来源于stack exchange,提问作者Ronne Timmerman
相关产品推荐
相关产品推荐

