【问题标题】:Basic typescript example of using protobufjs使用 protobufjs 的基本打字稿示例
【发布时间】:2016-08-27 19:17:39
【问题描述】:

我目前正在我的打字稿项目中实现一些协议缓冲区翻译。我已经将 proto 文件加载到 ProtoBuilder 中(使用来自 protobufjs.d.ts 的 typescript 定义文件),并且我已经从构建器返回了一个 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);

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

【问题讨论】:

  • 我对protobuf一无所知,但是在TypeScript中,你应该可以做到pb['decode'](buffer),或者(<any>pb).decode(buffer)
  • 第一个选项(显然在我的问题中删除了方括号)无效,但是,分配 var decoder: any = pb['decode'];确实允许我调用解码器(缓冲区)。我希望得到一个更好看的答案,所以我会稍微开放一下,但我绝对感谢 (pb) 位,因为这可能会在未来派上用场。
  • “无效”?您是否收到构建错误?如果是这样,将其添加到您的问题中会很有帮助...
  • 在问题中添加了错误信息。谢谢。
  • 你试过pb.decode(buffer)吗?

标签: javascript typescript protocol-buffers protobuf.js


【解决方案1】:

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

pb['decode'](buffer)

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-12-16
    • 2018-01-21
    • 1970-01-01
    • 2017-08-06
    • 2013-08-27
    • 1970-01-01
    • 2017-12-04
    • 2019-07-26
    • 1970-01-01
    相关资源
    最近更新 更多