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)
但如果存在的话,我更喜欢一种更优雅的解决方案。
使用现有 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)
此代码与其他解决方法类似,即仅声明pb为any. 以下代码内联执行此操作:
(<any>pb).decode(buffer);
Run Code Online (Sandbox Code Playgroud)
这段代码基本上是告诉 TypeScript 编译器“假装pb是有decode方法的东西,或者其他什么”。
| 归档时间: |
|
| 查看次数: |
5926 次 |
| 最近记录: |