2016-08-03 13 views
1

TypeScriptはタイプを含むES6 Javascriptのスーパーセットです。クラスはclassキーワードを使用して宣言し、Javaの場合と同様にnewキーワードを使用してインスタンス化することができます。TypeScriptでは、 "new"キーワードなしでクラスを使用できますか?

newキーワードを使用せずにクラスをインスタンス化することができるTypeScriptの使用例があるかどうかは疑問でした。

Bobというクラスがあるとしたら、Bobのインスタンスがnew Bob()でインスタンス化されていると仮定できますか?デフォルトではこの反対

答えて

4

活字体のセーフガード、あなたがこれを行う場合:

Value of type typeof A is not callable. Did you mean to include 'new'?

がしかし使用せずに作成することができますいくつかのオブジェクトがあります:あなたがエラーを取得します

class A {} 
let a = A(); 

newキーワード、基本的にすべてのネイティブタイプ。
あなたがlib.d.tsを見ればあなたがたとえば、異なるコンストラクタの署名を見ることができます:

StringConstructor

interface StringConstructor { 
    new (value?: any): String; 
    (value?: any): string; 
    ... 
} 

ArrayConstructor

interface ArrayConstructor { 
    new (arrayLength?: number): any[]; 
    new <T>(arrayLength: number): T[]; 
    new <T>(...items: T[]): T[]; 
    (arrayLength?: number): any[]; 
    <T>(arrayLength: number): T[]; 
    <T>(...items: T[]): T[]; 
    ... 
} 

することができますようにnewキーワードがある場合とない場合が常に同じctorsを参照してください。
もちろん、この動作を模倣することもできます。

JavaScriptがチェックされないので、typescriptでチェックが行われないため、コードを使用するjsコードを書くと、newを忘れる可能性があります。状況はまだ可能性があります。

実行時にこの問題が発生した場合は、それを検出してから、適切に処理してください(エラーをスローし、newを使用してインスタンスを戻してログに記録してログに記録してください)。ここ
はそれについて話すのポストです:Creating instances without new(無地JS)が、TL; DRは次のとおりです。あなたは短い答えは "イエス" であることを言っているよう

class A { 
    constructor() { 
     if (!(this instanceof A)) { 
      // throw new Error("A was instantiated without using the 'new' keyword"); 
      // console.log("A was instantiated without using the 'new' keyword"); 

      return new A(); 
     } 
    } 
} 

let a1 = new A(); // A {} 
let a2 = (A as any)(); // A {} 

code in playground

+2

サウンズ。 –

+0

確かに、簡単な答えは:はい、 'new'を使わずにctorを呼び出すことは可能です(しかしそのような場合にはインスタンスはありません) –

関連する問題