使用 protobufjs 的基本打字稿示例

Basic typescript example of using protobufjs

我目前正在我的打字稿项目中实施一些协议缓冲区翻译。我已经将原型文件加载到 ProtoBuilder 中(使用来自 protobufjs.d.ts 的打字稿定义文件)并且我已经从构建器返回了一个 ProtoBuf。

如果我在名为 pb 的变量中拥有 ProtoBuf 对象后设置断点,我可以在控制台中调用 pb.decode(buffer) 并且它可以工作。然而,TypeScript 不喜欢这种语法。

经过多次摸索和催促,包括尝试以下操作:

pb["decode"](buffer)

(这给出错误 TS2349 无法调用类型缺少调用签名的表达式。)

我还是无法像代码那样获取TypeScript编译器。

如何从 TypeScript ProtoBuf 对象获取隐藏在 MetaMessage 对象中的解码函数?

如果重要的话,我会在 Visual Studio 2015 年做这件事。

编辑: 我可以使用以下方法解决问题:

var decoder: any = pb["decode"];
decoder(buffer);

但如果存在的话,我更喜欢更优雅的解决方案。

使用现有 JavaScript 库的定义文件可能会很棘手,因为 JavaScript 的定义非常松散,而 TypeScript 的定义非常明确。如果不修改现有的 .d.ts 文件或编写您自己的文件,选项将受到限制。理论上,以下应该有效:

pb['decode'](buffer)

但你提到它没有。您设置中间变量的解决方法工作正常:

var decoder: any = pb["decode"];
decoder(buffer);

此代码类似于其他解决方法,即仅将 pb 声明为 any。以下代码内联执行此操作:

(<any>pb).decode(buffer);

这段代码基本上是告诉 TypeScript 编译器"just pretend pb is something that has a decode method, or whatever"。