1. ホーム
  2. typescript

[解決済み] コンストラクトシグネチャを持つインターフェースはどのように機能するのですか?

2022-04-13 20:17:11

質問

インターフェイスでコンストラクタを定義する方法について困っています。私は何かを完全に誤解しているのかもしれません。しかし、私はしばらくの間、答えを探しましたが、これに関連するものを見つけることができません。

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