2016-03-21 4 views
0

、普段とクラス型のタイプを定義:クラスが引数として渡されたときに、例えばなぜobject.constructorは "Function"であり、TypeScriptでは "newable"ではないのですか?活字体で

declare type Type = { 
    new (...args: any[]): any 
} 

、これを用いることができます。これは、TypeがC#にあるものと似ていますが、new演算子で直接インスタンス化することもできます。私の知る限り、このタイプ定義はに効果的に類似している:引数、プロパティ、または他の変数は(コンストラクタ関数に、より正確に)クラスへの参照を含むと予想される場合

A constructor function that may receive any number and type of arguments, and may return anything.

Typeタイプは常に私には非常に便利です。


しかし、時には私はクラス(コンストラクタ関数)自体への参照を持たない状況に出くわすことがあります。そのプロトタイプだけです。しかし、それはしかし、タイプFunctionである

obj.constructor 

によってクラス自体への参照を取得することは可能だし、クラスとしてインスタンス化することはできません:これはエラーを生成

new obj.constructor(); // Error: Cannot use 'new' ... 

Cannot use 'new' with an expression whose type lacks a call or construct signature.

私はタイプのアサーションを使用している場合、コンパイラはnewオペレータを受け入れ、実行時に予想されるようにコンパイルされたコードは動作します。

なぜobj.constructorは新製品ではないのですか?

+0

あなたはコードの完全な例として与えることができますか?あなたが持っているものを再現しようとしましたが、なぜ生成されたjsから新しいobj.constructor()**を呼び出すことができなかったのかは明らかです。オブジェクトに**コンストラクタ**プロパティはありません。 http://www.typescriptlang.org/Playground#src=type%20Type%20%3D%20%7B%0A%20%20%20%20new%20(..args%3A%20any%5B%5D) )%3A%20A%20A%20A%20A%20A%20A%20A%20A%20A%20A%20%%20A%20%%20%%20A%20%20%20%20%20%20%%20%7B%0A% 0A%20%20%20%20%7D%0A%7D%0A%0Alet%20b%20%3D%20new%20a()%3B – toskv

答えて

2

現在、TypeScriptにはconstructorプロパティの特別な処理がありません。それはdefined in lib.d.ts for the Object interface,なので、一般的に関数としてのみ定義できます。

https://github.com/Microsoft/TypeScript/issues/3841およびhttps://github.com/Microsoft/TypeScript/issues/4356が該当します。

あなたがこれを行うことができます:あなたはfooのタイプのジェネリックにすることができます

class Foo { 
    constructor(public x: string) { } 
} 
var foo = new Foo("foo"); 

var bar = new (foo.constructor as { new(x: string): typeof foo })("bar"); 

を(つまり、明示的に型アサーションでFooを記述する必要はありません)、あなたはまだ必要パラメータを明示的に書き込むか、...args: any[]で回避します。

関連する問題