2016-07-08 9 views
3

いくつかの "生成された"プロトタイプメソッドをJavaScriptスクリプトに変換しています。生成されたメソッドは内部オブジェクトにマップされるため、APIはそのユースケースの80%でよりクリーンで便利です。ダイナミックプロトタイプメソッドをtypescriptに宣言する

しかし、どのタイプのメソッドが実際に実装されていないのかをタイプスクリプトに正しく伝える方法はありません。 error TS2339: Property 'test' does not exist on type 'A'

class A {} 

A.prototype.test = function() {} 

var a = new A().test(); 

このエラー私は手動でプロパティを定義することで、それを回避することができますように思えるが、それは自動的にこれらのメソッドをマッピングの有用性を妨げます。

class A { 
    test: any; 
} 

A.prototype.test = function() {} 

var a = new A(); 
a.test(); 
+0

私はまだtypescriptに精通していませんが、このようなことはしないでください。class A {} A.prototype.test = function(){console.log( 'test'); } var a = new A(); a.test(); – mwilson

+0

新しいA()をかっこで囲む方が良いでしょうが、このデモの目的では影響はありません。 – helion3

+0

右。しかし、 'A'を新しいクラスとしてインスタンス化すると、' .test() 'にはまだアクセスできません。あなたは 'var a = new A();'を実行しなければならないので、 'a.test()'にアクセスできます...しかし、私はこの問題を誤解しているかもしれません。 – mwilson

答えて

1

しかし、私は適切な方法は、実際にそれらを実装せずに存在するtypescriptですが教えする方法を見つけるんです。

メソッドが生成された場合、なぜクラスを定義することもできますか?すなわち、代わりのclass Aあなたが本当に唯一はつまり、あなたがやるべきクラスを宣言する必要があります。

declare class A { 
    test(); 
} 
+0

'なぜクラスを定義するのですか?'クラスには動的なものしか含まれていない可能性があります。 ;) – Blackus

+0

@Blackus実装は、完全または部分的な動的なもので生成することができます。クラスは両方のケースで宣言できます。 – Paleo

+0

@Paleoええ、クラス「A」に定義されているメソッドがいくつかある場合は、「添付」だけでなく「宣言」で十分ではありません。 – Blackus

0

を、私はプロパティを定義することで、それを回避することができ、手動で

はい。動的な部分のため、型をTypeScriptで静的に推論することはできません。これは、手動で定義する必要があります。

class A { 
    test:() => void; 
} 
A.prototype.test = function() {} 

それとも、私が時々使う別の方法:

  1. 動的それは一部のメンバーをエクスポートし、活字体モジュールファイルにAPIを構築します。
  2. JavaScriptコードにコンパイルします。
  3. ファイルindex.d.tsを書き出します。は、APIのエクスポートされたモジュールメンバー(@basaratの回答のような)をと宣言しています。
  4. 別のプロジェクト(別のtsconfig.json)で、index.d.tsの宣言の助けを借りて、JavaScriptコードからAPIのモジュールメンバーをインポートします。

このプロセスは、npmパッケージを公開する場合に特に適しています。

+0

私の特定のニーズに対しては、これは残念なことにおそらく過剰です。彼らが生成された理由の一部は、マップされていたものから新しいメソッドを自動的に更新することでした。あらゆるソリューションにおいて、どこか実際の静的リストを管理する必要があるようです。私はむしろ複数の行で、それらをAPIで実装するラッパー関数を書いています。また、生成されたメソッドもjs-docにできない問題を解決します。 – helion3

関連する問題