[解決済み] コンストラクトシグネチャを持つインターフェースはどのように機能するのですか?
質問
インターフェイスでコンストラクタを定義する方法について困っています。私は何かを完全に誤解しているのかもしれません。しかし、私はしばらくの間、答えを探しましたが、これに関連するものを見つけることができません。
TypeScriptのクラスで以下のインターフェイスを実装するにはどうしたらよいでしょうか。
interface MyInterface {
new ( ... ) : MyInterface;
}
Anders Hejlsbergは、これに似たものを含むインターフェイスをこの中に作成します。 ビデオ (14分頃)。しかし、どうしてもこれをクラスで実装することができない。
私はおそらく何かを誤解しているのだと思いますが、何がわからないのでしょうか?
EDIT
明確にするために。new ( ... )"で、私は"anything"を意味しました。私の問題は、この最も基本的なバージョンさえも動作させることができないことです。
interface MyInterface {
new () : MyInterface;
}
class test implements MyInterface {
constructor () { }
}
クラス 'test' はインターフェース 'MyInterface' を宣言していますが、それを実装していません。型 'MyInterface' は構成署名を必要としますが、型 'test' はそれを欠いています" これをコンパイルしようとすると。
EDIT
ということで、ご意見を参考にもう少し調べてみました。
interface MyInterface {
new () : MyInterface;
}
class test implements MyInterface {
constructor () => test { return this; }
}
は有効なTypeScriptではなく、これでは問題が解決しません。コンストラクタの戻り値の型を定義することはできません。これは "test" を返します。 以下のようなシグネチャになります。 class test { コンストラクタ() { } } "new () => test"となるようです(オンラインエディタで、そのコードだけを貼り付けた "class" にカーソルを合わせると得られます)。そして、これは私たちが望むものであり、私が考えたものです。
どなたか、実際にコンパイルしている例などを教えていただけませんか?
EDIT(またか・・・)。
そこで、なぜインターフェースで定義できるのに、TypeScriptのクラスで実装できないのか、思い当たる節があったかもしれません。
var MyClass = (function () {
function MyClass() { }
return MyClass;
})();
interface MyInterface {
new () : MyInterface;
}
var testFunction = (foo: MyInterface) : void => { }
var bar = new MyClass();
testFunction(bar);
では、これはjavascriptをインターフェイスにできるTypeScriptの機能だけなのでしょうか?それとも、javascriptでクラスを実装しなくても、TypeScriptで実装できるのでしょうか?
どのように解決するのですか?
インターフェイスのコンストラクト・シグネチャは、クラスでは実装できません。以下は、インターフェイスを含む例です。
new
のシグネチャは動作します。
interface ComesFromString {
name: string;
}
interface StringConstructable {
new(n: string): ComesFromString;
}
class MadeFromString implements ComesFromString {
constructor (public name: string) {
console.log('ctor invoked');
}
}
function makeObj(n: StringConstructable) {
return new n('hello!');
}
console.log(makeObj(MadeFromString).name);
これは、呼び出すことができるものに対する実際の制約を作成します。
makeObj
を使っています。
class Other implements ComesFromString {
constructor (public name: string, count: number) {
}
}
makeObj(Other); // Error! Other's constructor doesn't match StringConstructable
関連
-
[解決済み] オブジェクトの型は「不明」です typescript generics
-
[解決済み] エラー TS2345: 型 'T' の引数は型 'object' のパラメータに代入できません。
-
[解決済み] TypeScriptでオブジェクトに動的にプロパティを割り当てるには?
-
[解決済み] Javaインターフェースでスタティックメソッドを定義できないのはなぜですか?
-
[解決済み] JSONオブジェクトをTypeScriptのクラスにキャストする方法を教えてください。
-
[解決済み] TypeScriptのオブジェクトリテラルでの型定義
-
[解決済み] Typescript によるインターフェース型チェック
-
[解決済み] JSX.ElementとReactNodeとReactElementの使い分けは?
-
[解決済み】「インターフェースに合わせたプログラム」とはどういう意味ですか?
-
[解決済み】Visual Studio Codeで.js.mapファイルを非表示にする方法
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ブロックスコープ付き変数の再宣言ができない(typescript)
-
[解決済み] タイプスクリプトのエラーです。TS7053 要素が暗黙のうちに 'any' 型を持っています。
-
[解決済み] error TS2339: Property 'x' does not exist on type 'Y'.
-
[解決済み] TypeScriptでfetchを使う方法
-
[解決済み] TypeScriptでグローバル変数を作成する
-
[解決済み] Object literal may only specify known properties" というエラーが発生するのはなぜですか?
-
[解決済み] クラス定数を実装するには?
-
[解決済み] ジェネリックスを使用したTypescriptのarrow関数の構文はどのようになっていますか?
-
[解決済み] チェックした後に○○の表現が変わっている
-
[解決済み】TypeScriptの関数のオーバーローディング