4

現在、typescript プロジェクトでいくつかのプロトコル バッファ変換を実装しています。ProtoBuilder に読み込まれた proto ファイルを取得し ( 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);

しかし、もしあれば、よりエレガントなソリューションを好むでしょう。

4

1 に答える 1

2

JavaScript は非常に緩く定義されているのに対し、TypeScript は非常に明確に定義されているため、既存の JavaScript ライブラリの定義ファイルを操作するのは難しい場合があります。既存の .d.ts ファイルを変更したり、独自に作成したりしないと、オプションが制限されます。理論的には、次のように動作するはずです。

pb['decode'](buffer)

しかし、あなたはそうではないと言いました。中間変数を設定する回避策はうまくいきます:

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

pbこのコードは、として宣言するだけの他の回避策と似ていanyます。次のコードはこれをインラインで行います。

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

このコードは基本的に、TypeScript コンパイラに「メソッドpbを持っているものなどのふりをする」ように指示しています。decode

于 2016-05-16T22:24:08.403 に答える