[解決済み] TypeScriptのdeclare classとinterfaceの違いとは?
質問
TypeScriptで、ソース宣言ファイル.d.tsを作成する場合、どちらが良いか、またその理由は?
declare class Example {
public Method(): void;
}
または
interface Example {
Method(): void;
}
私が言える違いは、インターフェースは静的メソッドを持つことができないので、そのためにクラスを使わなければならないことです。どちらもJS出力はしないので、もしかしたら関係ないのかも?
解決方法は?
interface
は、単にオブジェクトの形状を記述したいときのためのものです。インターフェイスにはコード生成がありません。クラスが
implements
節があるかどうかによるクラスのコード生成の違いはありません。
declare class
は
既存の
クラス(通常はTypeScriptのクラスですが、必ずしもそうとは限りません)が外部に存在する場合(例えば、二つの.tsファイルがあり、二つの.jsファイルにコンパイルされ、両方が
script
タグでインクルードされている場合など)。を継承している場合
class
を使用して
extends
(ベース型が
declare class
であるか、通常の
class
を使用する場合、コンパイラはプロトタイプチェーンと転送コンストラクタをフックするためのすべてのコードを生成する予定です。
を継承しようとすると
declare class
から継承しようとすると、生成されたコードが実行時のマニフェストを持たないオブジェクトを参照することになるため、実行時エラーになります。
逆に、もし単に
implement
であるべきインターフェイスが
declare class
を使用する場合、すべてのメンバーを自分で再実装しなければならず、基底クラスであるはずのコードの再利用を利用することができません。また、実行時にプロトタイプチェーンをチェックする機能は、オブジェクトが実際には基底クラスのインスタンスでないとして拒否します。
C++のバックグラウンドを持っている人なら、本当にオタクになるために、おおよそ次のように考えることができます。
interface
として
typedef
そして
declare class
を
extern
の宣言は、このコンパイルユニットでは厳密に定義されていないコンストラクタの宣言であることを示します。
純粋に消費する側(新しい型を追加するのではなく、命令的なコードを書く)からすると、唯一の違いは
interface
と
declare class
ができないことです。
new
というインターフェースです。しかし、もしあなたが意図的に
extend
/
implement
これらのタイプのいずれかを新しい
class
の間で正しく選択されている必要があります。
interface
と
declare class
. どちらか一方だけが動作します。
うまくいくのは2つのルール
-
型名がコンストラクタ関数と一致しているか。
new
で呼び出せるもの) と整合しているか (例えばDate
はそうですがJQueryStatic
は違う)?もし はありません の場合、あなたは間違いなくinterface
-
他のTypeScriptファイルからコンパイルされたクラス、または十分に類似したものを扱っているのでしょうか?もし
の場合
であれば
declare class
関連
-
[解決済み】event.stopPropagationとevent.preventDefaultの違いは何ですか?
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] JavaScriptでメールアドレスを検証するのに最適な方法は何ですか?
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] Bowerとnpmの違いは何ですか?
-
[解決済み] コンストラクタとngOnInitの違いについて
-
[解決済み] Typescript によるインターフェース型チェック
-
[解決済み] Javascript 確認ポップアップの「OK」「キャンセル」の代わりに「はい」「いいえ」ボタン
-
[解決済み] マウスオーバー時のマウスカーソルをアンカーのようなスタイルに変更する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JSのDateからDay名
-
[解決済み] javascript の関数から `undefined` と `null` のどちらを返すのが良いのでしょうか?
-
[解決済み] 文字列が空白であるかどうかをチェックする
-
[解決済み] <noscript> の反対語のHTMLはありますか?
-
[解決済み] Typescript流のMongoose...?
-
[解決済み] SVG のテキスト要素の幅を取得する
-
[解決済み] node.js シェルコマンドの実行
-
[解決済み] React.jsでテキスト入力のchange/focusOutイベントを正しくキャッチする方法とは?
-
[解決済み] AngularJsでng-repeatを使用してフィルタリング(キー、値)を行うには?
-
[解決済み] JavaScriptの文字列は何バイトですか?