You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:13:13