javascript - Typescript における new() とは何ですか?
私はジェネリクスに関する公式ドキュメントで、ここでnew()に出会いました。
こちらがコードのコンテキストです:
function create<T>(c: { new(): T; } ): T {
return new c();
}
上記のコードは、次のJavaScriptコードにトランスパイルされます:
function create(c) {
return new c();
}
`new()` はJavaScriptでは違法な構文です。TypeScriptではこれはどういう意味ですか?
さらに、{new(): T; } はどういう意味ですか?型であることは分かりますが、どのようにですか?
回答 #1
`new()`はTypeScriptにおけるコンストラクターのシグネチャを表します。これは、コンストラクターの形状を表すということです。例えば、`{new(): T; }`を考えてみてください。あなたの言う通り、それは型です。それは、コンストラクターが引数を取らないクラスの型です。次の例を考えてみましょう。
function create<T>(c: { new(): T; } ): T {
return new c();
}
これは、関数 create が引数を取り、その引数のコンストラクタが引数を取らず、T 型のインスタンスを返すことを意味します。
function create<T>(c: { new(a: number): T; } ): T
これはつまり、create 関数が 1 つの数値 a を受け取るコンストラクタを持つ引数を受け取り、型 T のインスタンスを返すということです。別の言い方をすると、次のクラスの型です。
class Test {
constructor(a: number){
}
}
は {new(a: number): Test} になります
回答 #2
new キーワードはクラスのインスタンスを作成するために使用されるので、その最も基本的な形では:
class SimpleClass {
}
次のように構築されます:
let simpleClassInstance = new SimpleClass();
これはすべて順調ですが、ジェネリッククラスのインスタンスをどのように作成するのですか、つまり:
class SimpleClassFactory< T > {
static create( T ) {
return new T(); // compile error could not find symbol T
}
}
次のように使用されます:
let simpleClassInstance = SimpleClassFactory.create(SimpleClass);
ここで、クラスの定義を使用してクラスのインスタンスを作成しようとしています。これはコンパイルエラーを発生させます。
ですので、型はそのコンストラクタのシグネチャで参照する必要があります。
class SimpleClassFactory< T > {
static create( type: { new(): T ;} ) {
return new type(); // succeeds
}
}
