使用 protobufjs 的基本打字稿示例

Chr*_*ris 5 javascript protocol-buffers typescript protobuf.js

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

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

经过多次探索和刺激,包括尝试以下方法:

pb["decode"](buffer)
Run Code Online (Sandbox Code Playgroud)

(这会产生错误 TS2349 无法调用其类型缺少调用签名的表达式。)

我仍然无法像代码一样获得 TypeScript 编译器。

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

如果重要的话,我正在 Visual Studio 2015 中执行此操作。

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

var decoder: any = pb["decode"];
decoder(buffer);
Run Code Online (Sandbox Code Playgroud)

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

Her*_*key 2

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

pb['decode'](buffer)
Run Code Online (Sandbox Code Playgroud)

但你提到它没有。设置中间变量的解决方法效果很好:

var decoder: any = pb["decode"];
decoder(buffer);
Run Code Online (Sandbox Code Playgroud)

此代码与其他解决方法类似,即仅声明pbany. 以下代码内联执行此操作:

(<any>pb).decode(buffer);
Run Code Online (Sandbox Code Playgroud)

这段代码基本上是告诉 TypeScript 编译器“假装pb是有decode方法的东西,或者其他什么”。