如何在TypeScript中创建兼容protobuf.js Timestamp类型的对象?
问题:protobuf.js中Timestamp字段赋值的TypeScript错误
场景重现
Protocol Buffer定义
syntax = "proto3"; import "google/protobuf/timestamp.proto"; message MyMessage { Timestamp expires_at = 1; }
TypeScript代码
import { MyMessage } from ... import { Timestamp } from 'google-protobuf/google/protobuf/timestamp_pb.js' export const myFunction() { let myMessage = new MyMessage() myMessage.expiresAt = new Timestamp() }
报错信息
Type 'Timestamp' has no properties in common with type 'ITimestamp'
解答
1. 错误原因
你混用了两个不同Protocol Buffer JS库的Timestamp类型:
- 导入的
Timestamp来自Google官方的google-protobuf库,是类实例类型 - protobuf.js生成的
MyMessage中,expiresAt字段要求的是protobuf.js定义的ITimestamp类型,两者分属不同生态,类型结构不兼容,因此触发TypeScript类型检查错误。
2. ITimestamp是什么
ITimestamp是protobuf.js根据google/protobuf/timestamp.proto生成的接口类型,本质是一个普通JavaScript对象,只需包含两个数字属性:
seconds: Unix纪元开始计算的秒数nanos: 纳秒部分(范围0-999999999)
它不需要实例化类,只要对象结构符合该接口,就能被protobuf.js识别。
3. 创建兼容protobuf.js的Timestamp对象的方法
方法一:直接构造普通对象
手动生成符合ITimestamp结构的对象:
const now = Date.now(); myMessage.expiresAt = { seconds: Math.floor(now / 1000), nanos: (now % 1000) * 1000000 // 毫秒转纳秒 };
方法二:使用protobuf.js生成的Timestamp类型
如果是通过protobuf.js的pbjs/pbts工具生成的代码,直接从生成文件导入Timestamp:
// 从自己的protobuf.js生成文件导入 import { MyMessage, Timestamp } from './path/to/generated/code.js'; const ts = new Timestamp(); // protobuf.js的Timestamp类提供便捷转换方法 ts.fromDate(new Date()); myMessage.expiresAt = ts;
方法三:转换官方库的Timestamp对象(若必须用官方库)
如果依赖官方google-protobuf库的Timestamp,可将其转换为符合ITimestamp结构的对象:
import { Timestamp as OfficialTimestamp } from 'google-protobuf/google/protobuf/timestamp_pb.js'; const officialTs = new OfficialTimestamp(); officialTs.fromDate(new Date()); myMessage.expiresAt = { seconds: officialTs.getSeconds(), nanos: officialTs.getNanos() };
内容的提问来源于stack exchange,提问作者Aaron Stanek
相关产品推荐
相关产品推荐

