You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在使用ts-proto生成TypeScript类型时将google.protobuf.Timestamp字段设为必填?

如何在使用ts-proto生成TypeScript类型时将google.protobuf.Timestamp字段设为必填?

嘿,这个问题我之前用ts-proto的时候也碰到过,刚好可以给你捋清楚来龙去脉和解决办法~

首先,为什么生成的类型是Date | undefined呢?这是因为Protobuf 3的默认规则:所有没标记required的字段都是可选的——也就是说,序列化的数据里可以没有这个字段,ts-proto会严格遵循这个规则,把这类字段的TypeScript类型加上undefined,表示它可能不存在。

要把created_at改成纯Date类型,有两个靠谱的方案,看你的需求选:

方案一:在Proto文件里标记字段为required(最推荐)

这个方案是从Protobuf层面强制字段必填,不仅TypeScript会生效,其他用这个proto文件的语言(比如Java、Go)也会同步遵循,能从根源上保证数据完整性。

注意:这个特性需要Protobuf 3.12及以上版本支持,如果你用的是更早的版本,得先升级一下Protobuf工具链。

修改你的proto文件:

syntax = "proto3"; // 确保声明为proto3,且版本≥3.12
import "google/protobuf/timestamp.proto";

message DummyDraft {
  required google.protobuf.Timestamp created_at = 1;
}

然后重新运行你原来的protoc生成命令,生成的TypeScript类型就会变成:

export interface ProtoDummyDraft {
  created_at: Date;
}

完美符合你的需求~

方案二:用ts-proto配置强制生成非可选类型(不修改Proto文件的情况)

如果你因为某些限制不能修改Proto文件,可以通过ts-proto的配置选项来调整类型生成规则,但这个方案是全局生效的,会影响所有字段,要谨慎用。

修改你的protoc命令,加上--ts_proto_opt=useOptionals=none参数:

protoc \
--plugin="./node_modules/.bin/protoc-gen-ts_proto" \
--ts_proto_out="$outputDir" \
--ts_proto_opt=esModuleInterop=true \
--ts_proto_opt=snakeToCamel=false \
--ts_proto_opt=typePrefix=Proto \
--ts_proto_opt=useOptionals=none \
-I "./src/protos" \
./src/protos/*.proto

这个参数会让ts-proto把所有字段都生成非可选类型,不管Proto里有没有标记required。但要注意,这会把你proto里的其他可选字段也变成必填的,如果其他字段本来就允许缺失,这个方案就不太合适了,所以还是优先推荐方案一哦~

这样应该就能解决你的问题啦,有其他细节问题随时问~

火山引擎 最新活动