Typescript https://github.com/CliffCloud/Leaflet.EasyButton/blob/master/src/easy-button.jsでeasy-buttonsプラグインを使用したいと思いますが、Typescriptアノテーションは付属していません。リーフレットプラグイン用のTypescript定義を追加するには
答えて
ステップ1 -
最初のステップは、活字体の注釈なしでそのままのサンプルコードを使用することで、エラーを点灯し、エラーがVSコードに点灯を開始します。
// sample.ts
L.easyBar([
L.easyButton('fa-file', function(btn, map){ }),
L.easyButton('fa-save', function(btn, map){ }),
L.easyButton('fa-edit', function(btn, map){ }),
L.easyButton('fa-dot-circle-o', function(btn, map){ })
]).addTo(map);
「easy-button.d.ts」という名前のファイルを作成し、それをTypescriptファイルで参照します。
// sample.ts
import "./easy-button"
L.easyBar([
L.easyButton('fa-file', function(btn, map){ }),
L.easyButton('fa-save', function(btn, map){ }),
L.easyButton('fa-edit', function(btn, map){ }),
L.easyButton('fa-dot-circle-o', function(btn, map){ })
]).addTo(map);
で簡単button.d.ts
で何もない// easy-button.d.ts
// empty for now
エラーは、我々はまだこれらを定義していないので、十分に公平である
error TS2339: Property 'easyBar' does not exist on type 'typeof L'.
error TS2339: Property 'easyButton' does not exist on type 'typeof L'.
氏は述べています。
あなたはeasyBar
とeasyButton
hereとhereの定義を参照する場合は、元のJavascript宣言で魔法occuringのビットがありますでしょう。これらの2つの関数は引数を取っていないように見えますが、現実にはそういうことがあります。
L.easyButton = function(/* args will pass automatically */){
var args = Array.prototype.concat.apply([L.Control.EasyButton],arguments);
return new (Function.prototype.bind.apply(L.Control.EasyButton, args));
};
この関数はL.Control.EasyButton
クラスにnew
を呼び出すために起こっています。パラメータはやや不可解ですが、あなたは与えthis lineからそれらを推測することができます。
initialize: function(icon, onClick, title, id)
ステップ2 - タイピング
// easy-button.d.ts
declare namespace L {
function easyBar();
function easyButton();
}
、今は少し近づいている追加:
error TS2346: Supplied parameters do not match any signature of call target
それは2つのパラメータ 'fa-edit'と、easyButton
へのコールバックを提供したが、私たちの議論では何も宣言していなかったので、それはかなり明白です。 2回目の試行は次のようになります。
// easy-button.d.ts
declare namespace L {
function easyBar(buttons: any[]);
function easyButton(icon: string, onClick: (btn: any, map: any)=>void);
}
今、すべてのTypescriptの警告が消えています。しかし、それ以上のことができます。 1つは、easyButton
は実際に4つの引数をとります。それは修正するのは簡単です - ?
接尾辞を持っているかオプションの引数を観察:
// easy-button.d.ts
declare namespace L {
function easyBar(buttons: any[]);
function easyButton(icon: string, onClick: (btn: any, map: any)=>void, title?: string, id?: string);
}
ステップ3 - 提供のリターンは
easyButton
方法は、実際にL.Control.EasyButton
インスタンスを返す値。現在、Typescriptの定義は、easyButton
の戻り値タイプany
を意味します。私たちはそれを望んでいません! Typescriptは、タイピングを提供する場合にのみ役立ちます。
declare namespace L {
function easyBar(buttons: Control.EasyButton[]): Control.EasyBar;
function easyButton(icon: string, onClick: (btn: any, map: any)=>void, title?: string, id?: string) : Control.EasyButton;
namespace Control {
class EasyButton { };
class EasyBar { };
}
}
活字体は再び有益な警告を提供開始します。
error TS2339: Property 'addTo' does not exist on type 'EasyBar'.
をEasyBarは、我々が定義ファイルにその定義を持参する必要がL.Control
をサブクラスからです。
declare namespace L {
function easyBar(buttons: Control.EasyButton[]): Control.EasyBar;
function easyButton(icon: string, onClick: (btn: any, map: any)=>void, title?: string, id?: string) : Control.EasyButton;
namespace Control {
class EasyButton extends L.Control { }
class EasyBar extends L.Control { }
}
}
ステップ4 - EasyButtonとEasyBarにコンストラクタ引数を提供
新しいEasyButtonをインスタンス化しようとすると、コード補完は、あなたがこれを設定するには、L.ControlOptions
オブジェクトを渡す必要があることを示唆しています。実際には、独自のオプションを定義する必要があります。
declare namespace L {
function easyBar(buttons: Control.EasyButton[], options?: EasyBarOptions): Control.EasyBar;
function easyButton(icon: string, onClick: (btn: any, map: any)=>void, title?: string, id?: string) : Control.EasyButton;
interface EasyBarOptions {
position?: ControlPosition
id?: string
leafletClasses?: boolean
}
interface EasyButtonOptions {
position?: ControlPosition
id?: string
type?: 'replace'|'animate'
states?: any
leafletClasses?: boolean
tagName?: string
}
namespace Control {
class EasyButton extends L.Control {
constructor(options?: EasyButtonOptions)
}
class EasyBar extends L.Control {
constructor(options?: EasyBarOptions)
}
}
}
しかし、私はstates
オプションにだまさ。私はany
と宣言しました。活字体は、このプラグインのユーザーに有益なコメントを提供します追加JSDocのヒント
- 実際にそれが
interface EasyButtonOptions {
position?: ControlPosition
id?: string
type?: 'replace'|'animate'
states?: EasyButtonState[]
leafletClasses?: boolean
tagName?: string
}
interface EasyButtonState {
stateName: string
onClick:() => void
title: string
icon: string
}
ステップ5であるべきです。ここでは、easyButton
/**
* Creates a easyButton
* @param icon e.g. fa-globe
* @param onClick the button click handler
* @param label on the button
* @param an id to tag the button with
* @example
* var helloPopup = L.popup().setContent('Hello World!');
*
* L.easyButton('fa-globe', function(btn, map){
* helloPopup.setLatLng(map.getCenter()).openOn(map);
* }).addTo(YOUR_LEAFLET_MAP);
*/
function easyButton(
icon: string,
onClick: (btn: Control.EasyButton, map: L.Map) => void,
title?: string,
id?: string): Control.EasyButton;
ステップ6のドキュメントを提供するかもしれない方法の例だリーフレットの種類を増やすために変更を加え
を定義(リーフレット1.2.0以降で)名前空間宣言削除:
declare namespace L {
を
と交換してください:
import * as L from 'leaflet'
declare module 'leaflet' {
テストコードは次のように読んでください:
import * as L from 'leaflet'
import 'easy-button'
ステップ7までnode_modules\leaflet-easybutton\package.json
元のプロジェクトのソース
オープンに統合し、style
エントリの下に次の行を追加します。
"main": "src/easy-button.js",
"style": "src/easy-button.css",
"typings": "src/easy-button.d.ts",
easy-button.d.ts
をnode_modules/leaflet-easybutton/src
に移動し、すべてが動作することをテストします。
その後、すべての人が作業の恩恵を受けるようにプルリクエストを送信してください!
class EasyButton extends L.Control { constructor(options?: EasyButtonOptions) }
新しいL.EasyButtonは、コンストラクタのための 'EasyButtonOptions' オブジェクトを取ります。これは「L.easyButton」の例と一致しません。
A L.easyButtonは、次のオプションがあります。 function easyButton(icon: string, onClick: (btn: any, map: any)=>void, title?: string, id?: string) : Control.EasyButton;
アンEasyButtonOptionsではなく、 'アイコン'、 'onClickの'、 'タイトル' または 'ID' を持っていない、それはとります
interface EasyButtonOptions { position?: ControlPosition id?: string type?: 'replace'|'animate' states?: EasyButtonState[] leafletClasses?: boolean tagName?: string }
をそのため、 L.easyButton( 'fa fa-icon'、()=> '..'、 'title)にマッチする新しいL.EasyButton()に相当するものは何ですか?
こんにちはSteve、モジュールによってエクスポートされる2つの関数、 'easyButton'関数、' EasyButton'クラスがあります。クラスのコンストラクタは 'new L.EasyButton(...) 'と呼ばれる必要がありますが、easyButton関数は新しいEasyButtonインスタンスを提供します。私は十分に説明してくれることを願っています。 :) –
- 1. Typescript:型定義をObservable.of(null)に追加する
- 2. レスポンスにプロパティを追加するミドルウェアのTypeScript定義の書き方は?
- 3. マップの初期化後にリーフレットプラグインを追加しますか?
- 4. "window"オブジェクトにtypescript定義を追加する方法はありますか?
- 5. typescriptにinnerhtmlを追加するには?
- 6. MySQLデータベースに追加専用テーブルを定義する方法は?
- 7. ツールチップのhtml文字列定義にスタイル定義を追加するには?
- 8. バッチビジュアルスタジオビルドのグローバル定義を追加する
- 9. Visual Studio 2017でTypescript定義ファイルを使用するには?
- 10. TypeScriptが.defaultをグローバルに定義されたインポートに追加するのはなぜですか?
- 11. typescriptモジュールの追加定義をインストールするにはどうすればよいですか?
- 12. Typescript定義ファイルカスタムオーバーロード
- 13. yoctoにユーザ定義のパッケージ/レシピを追加するには?
- 14. basic_ostreamにユーザ定義のフォーマットフラグを "追加"するには?
- 15. TypeScript:インターフェイス定義の関数定義を再利用
- 16. TypeScript 2+に型定義をグローバルに追加する方法はありますか?
- 17. ジャスミンカスタムマッチャーtypescript定義を追加するにはどうすればよいですか?
- 18. BabelをTypescriptに追加するReact app
- 19. ユーザー定義のアイコンをIonic2に追加する方法は?
- 20. cmakeでマクロの定義を追加するには?
- 21. TypeScriptの型定義をオーバーライド
- 22. TypeScriptのデバッグ変数を定義する
- 23. Typescript:オブジェクトのタイプを定義する
- 24. タイプスクリプト定義ファイルをnpmパッケージに追加するには?
- 25. 依存関係ターゲットにcmake定義を追加するには?
- 26. Typescript Typings定義エラー
- 27. TypeScript jQuery型定義
- 28. は未定義typescriptですの「放出」
- 29. cmakeを使用して_CRT_SECURE_NO_WARNINGS定義を追加する
- 30. Visual Studioビルド定義 - ビルドに追加の(dll)ファイルを追加する方法?
あなたの簡単なボタンのコンストラクタインターフェイスには、L.easyButtonの初期化メソッドが含まれていません – Steve
ありがとうスティーブ、私は一見して、あなたがそこで何を意味していたかわかりませんでした。入力はhttps://github.com/CliffCloud/Leaflet.EasyButton/blob/master/src/easy-button.d.tsです.Githubに問題を提出すれば、そこで議論することができます。 –