既存のJavaScriptライブラリから.d.tsの「タイピング」定義ファイルをどのように作成しますか?


192

私は自分のライブラリとサードパーティの両方で多くのライブラリを使用しています。"typings"ディレクトリにJqueryとWinRTのいくつかが含まれているのがわかります...しかし、それらはどのように作成されますか?

回答:


232

問題のライブラリー、ライブラリーの記述方法、および求めている精度のレベルに応じて、いくつかのオプションが利用可能です。オプションを、望ましさの大まかな降順で確認してみましょう。

多分それはすでに存在します

常に最初にDefinitelyTyped(https://github.com/DefinitelyTyped/DefinitelyTyped)を最初に確認してください。これは文字通り何千もの.d.tsファイルでいっぱいのコミュニティリポジトリであり、使用しているものがすでに存在している可能性が非常に高いです。NPMで公開された.d.tsファイルの検索エンジンであるTypeSearch(https://microsoft.github.io/TypeSearch/)も確認する必要があります。これは、DefinitelyTypedよりもわずかに多くの定義を持ちます。いくつかのモジュールは、NPMディストリビューションの一部として独自の定義も出荷しています。そのため、独自のものを作成する前に、それが当てはまるかどうかも確認してください。

多分あなたはそれを必要としない

TypeScriptは--allowJsフラグをサポートし、.jsファイルでJSベースの推論をさらに行います。コンパイルに.jsファイルを--allowJs設定と一緒に含めて、十分なタイプ情報が得られるかどうかを確認できます。TypeScriptはこれらのファイル内のES5スタイルのクラスやJSDocコメントのようなものを認識しますが、ライブラリが奇妙な方法でそれ自体を初期化すると、作動する可能性があります。

はじめに --allowJs

Ifは--allowJsあなたにまともな結果を与え、あなたはより良い定義ファイルを自分で書きたい、あなたは組み合わせることができます--allowJs--declaration、ライブラリの種類に活字体の「最良の推測」を参照してください。これはまともな開始点を提供し、JSDocコメントが適切に記述され、コンパイラーがコメントを見つけられた場合は、手書きのファイルと同じくらい良いかもしれません。

dts-genを使ってみる

--allowJsうまくいかなかった場合は、dts-gen(https://github.com/Microsoft/dts-gen)を使用して開始点を取得することをお勧めします。このツールは、オブジェクトの実行時の形状を使用して、使用可能なすべてのプロパティを正確に列挙します。プラス面では、これは非常に正確になる傾向がありますが、ツールはまだ追加のタイプを入力するためのJSDocコメントのスクレイピングをサポートしていません。次のように実行します。

npm install -g dts-gen
dts-gen -m <your-module>

これyour-module.d.tsにより、現在のフォルダーに生成されます。

スヌーズボタンを押す

後でそれをすべて行い、しばらくタイプなしで済むようにしたい場合は、TypeScript 2.0で次のように記述できます。

declare module "foo";

タイプimport"foo"モジュールを許可しますany。後で処理したいグローバルがある場合は、

declare const foo: any;

これはfoo変数を与えます。


25
痛い...それは多くの場合、エントリのための重要な障壁になるでしょう。型の推論に基づいて少なくとも「最良の推測」を出力できるツールがあればよいでしょう。これらは最適ではないかもしれませんが、少なくとも時間の経過とともに調整できます。
Hotrodmonkey 2012年

7
+1-さらに良いニュース:ファイルとファイルの--declarations両方を生成.js.d.tsます。つまり、1回のコンパイルを実行するだけで済みます。
フェントン

67
人気のあるライブラリの高品質な定義のコレクションは、github.com / borisyankov / DefinitelyTyped
Boris Yankov

10
「最良の推測」ツールは、TypeScriptに既に存在するIntelliSenseに勝るものはありません。タイプ定義の利点は、「推測」できるよりも多くの情報をコンパイラに提供することです。
ボリスヤンコフ2012年

12
--allowJs--declarationオプション(活字体1.8および2.0で試験)結合することができません。試してみると、次のようになりますerror TS5053: Option 'allowJs' cannot be specified with option 'declaration'
。– Alexey

52

あなたはどちらかを使用することができtsc --declaration fileName.tsライアンなどが説明、またはあなたが指定することができますdeclaration: true下のcompilerOptionsあなたにtsconfig.jsonあなたがすでに持っていたと仮定するとtsconfig.json、プロジェクトの下に。


4
これは、共有したいAngular 2モジュールを開発している場合の最良の答えです。
ダーシー

私がしようとするとtsc --declaration test.ts、私はエラーを取得Cannot find name...私は:)だから私のための宣言ファイルを作成しようとしているというタイプのために、私はそれらを宣言することができます前に、種類がありますか?
ココドコ2017

2
@ここどこ、ファイルに追加declaration: trueしてみてくださいtsconfig.json
JayKan 2017

ありがとう、*。tsから* .d.tsを生成したいと思っていました。
vintproykt

16

これに対処する最良の方法(宣言ファイルがDefinitelyTypedで利用できない場合)は、ライブラリ全体ではなく、使用するものだけに宣言を書き込むことです。これにより、作業が大幅に削減されます。さらに、コンパイラーは、不足しているメソッドについて文句を言うことで支援します。


15

Ryanが言うように、tscコンパイラにはファイルからファイル--declarationを生成するスイッチがあります。また、(バグがない限り)TypeScriptはJavascriptをコンパイルできるはずなので、既存のjavascriptコードをtscコンパイラに渡すことができます。.d.ts.ts


1
現在* .jsファイルをtscに渡すと、エラー「ファイル "angular-resource.js"の読み取りエラー:ファイルが見つかりません」が生成されます。したがって、tscを使用するには、*。jsファイルの名前を* .tsに明示的に変更する必要があります。詳細については、この問題を参照してください。angularjsでこれを使用してみました:typescript.codeplex.com/workitem/26
James Strachan

3
私が言えることから、tscは有効なJavaScriptをコンパイルできますが、それが有効なTypeScriptではない場合(コンパイルにより警告が表示されます)、--declarationsフラグは.d.tsファイルを出力しません。そのため、ライブラリがTypeScriptで書かれていない限り、宣言ファイルを手動で作成する必要があります。
agradl 2012年


3

これは、単一のTypeScript定義ファイルと、*.js最新のJavaScriptを使用した複数のファイルを含むライブラリを作成するPowerShellです。

まず、すべての拡張子をに変更し.tsます。

Get-ChildItem | foreach { Rename-Item $_ $_.Name.Replace(".js", ".ts") }

次に、TypeScriptコンパイラを使用して定義ファイルを生成します。コンパイラエラーはたくさんありますが、無視してかまいません。

Get-ChildItem | foreach { tsc $_.Name  }

最後に、すべてのコンバイン*.d.ts1にファイルをindex.d.ts削除し、import文を削除し、default各輸出声明から。

Remove-Item index.d.ts; 

Get-ChildItem -Path *.d.ts -Exclude "Index.d.ts" | `
  foreach { Get-Content $_ } | `
  where { !$_.ToString().StartsWith("import") } | `
  foreach { $_.Replace("export default", "export") } | `
  foreach { Add-Content index.d.ts $_ }

これは、index.d.ts多くの定義を含む単一の使用可能なファイルで終わります。


2
2番目のステップ、Get-ChildItem | foreach {tsc --declaration $ _。Name }が機能した(欠落していた--declarationパラメータが追加された)
Guru_07

3

独自のライブラリを作成する場合、次のように(TypeScriptコンパイラ)コマンド*.d.tsを使用してファイルを作成できます tsc(ライブラリをdist/libフォルダに構築していると想定)。

tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly
  • -d--declaration):*.d.tsファイルを生成します
  • --declarationDir dist/lib:生成された宣言ファイルの出力ディレクトリ。
  • --declarationMap:対応する各「.d.ts」ファイルのソースマップを生成します。
  • --emitDeclarationOnly: '.d.ts'宣言ファイルのみを発行します。(コンパイルされたJSなし)

(すべてのコマンドラインコンパイラオプションについては、ドキュメントを参照してください)

または例えばあなたのpackage.json

"scripts": {
    "build:types": "tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly",
}

次に実行します:(yarn build:typesまたはnpm run build:types


私はまだd.tsファイルを生成する方法を理解できず、インターフェースを使用することができません。例はありますか?
Danosaure

上記のnpmスクリプトは*.d.tsファイルを生成し、dist/libフォルダーに配置します。tsconfig.jsonプロジェクトのルートにファイルが必要ですが、プロジェクトが動作するためにはそこにファイルが存在している必要があります。
magikMaker

一度公開すると、使用できなくなります。あなたがそれを機能させることができるならば、私は次のポストstackoverflow.com/questions/59742688を持っていますか?
Danosaure

2

Script#またはSharpKitをサポートするサードパーティのJSライブラリの既存のマッピングを探します。これらのC#から.jsへのクロスコンパイラのユーザーは、現在直面している問題に直面し、サードパーティのlibをスキャンしてスケルトンC#クラスに変換するオープンソースプログラムを公開している可能性があります。もしそうなら、C#の代わりにTypeScriptを生成するためにスキャナープログラムをハックしてください。

それに失敗すると、サードパーティlibのC#パブリックインターフェイスをTypeScript定義に変換する方が、ソースJavaScriptを読み取って同じことを行うよりも簡単な場合があります。

私の特別な関心はSenchaのExtJS RIAフレームワークであり、Script#またはSharpKitのC#解釈を生成するために公開されたプロジェクトがあることを知っています


:FYI:私はちょうど煎茶/ ExtJSのための私の最初のtypescriptです定義ファイル作らgithub.com/andremussche/extjsTypescript/blob/master/jsondocs/...
アンドレ・

Camel Caseさん、ExtJとtypescriptの使用に関するブログをまとめました: blorkfish.wordpress.com/2013/01/28/using-extjs-with-typescript
blorkfish
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.