2016-05-16 4 views
0

を型に代入ではありません私はオブジェクトの種類を認識するためにtypescriptしたいと思います。タイプのモジュールは、このコードを仮定したLoginModule

私は

var loginModule:Module = server.modules[0]; 

var loginModule:LoginModule = server.modules[0]; 

を変更することができますが、その後、私は私のIDEでインテリセンスのヒントを失うことになります。

答えて

1

財産modulesのdefintionので、それがないのLoginModuleの確認のためである

class Server{ 
    modules: Module[]; // type is not LoginModule, just Module 
    ... 

です。しかし、場合には、我々はインスタンスのLoginModuleであることを知って、私たちは、で割り当てを使用することができますas声明)を主張:

//var loginModule:LoginModule = server.modules[0]; 
var loginModule = server.modules[0] as LoginModule; 

そして今、LoginModuleの変数はLoginModuleインスタンスとして扱われます。.. 。

+0

前に 'as '演算子について聞いたことがありません。 Thanx、これはまさに私が必要なものです。 – SET

+0

'server.modules [0]'が 'LoginModule'でなければ、それを強制するものは何もありません。 'LoginModule'を常に持っていなければならない場合は、コードを生成して、' Server'コンストラクタに 'LoginModule'を必要とします。 – Fenton

+1

as演算子は** assert **です。つまり、私たちは "私は開発者としてTypescriptをもっと知っています。私はあなたの主張を裏付けています"と言っています。実際には、実行時に、メソッドが未定義のようなシナリオを実際に体験することができます。少し助けてくれることを願っています。そして、究極のガイド** https://basarat.gitbooks.io/typescript/content/docs/types/type -assertion.html ** –

0

ServerLoginModuleを必要とすることにより、要件を明示的に、LoginModuleを必要とする場合:

class Module{ 
    contructor(){ 
     // some logic here 
    } 
} 

class LoginModule extends Module{ 
    start(){} 

} 

class Server{ 
    modules: Module[]; 
    constructor(public loginModule: LoginModule, modules?: Array<{new():Module}>){ 
     for(var moduleConstructor of modules){ 
      var module = new moduleConstructor(); 
      this.modules.push(module); 
     } 
    } 
} 

var server = new Server(new LoginModule, [LoginModule]); 
var loginModule:LoginModule = server.loginModule; 

タイプシステムは、他の種類のModuleを渡そうとすると警告を表示するので、コンシューマとしてだけでなくプロバイダとしても保存されます。予想されるタイプも返されます。

構造が同一である限り、異なるLoginModuleタイプを提供することはできます。

すべてのモジュールを交換可能にするのではなく、特定の種類のモジュールを交換可能にしたいと思うので、コンストラクタ内の各タイプの1つまたは複数を許可します(私はあなたがExpressミドルウェアに似ています。ユーザーは、特定の種類のイベントに対していくつかのハンドラを指定できます)。

+0

これは私には当てはまりません。私の例では、モジュール配列の最初の要素が 'LoginModule'のオブジェクトであることを知っています。しかし、実際の状況では、おそらく多分10またはモードのオブジェクトがランダムな順序で配列されていて、私が知る限り、それらはすべて1つの基本クラスから拡張されていることになります。 – SET

+0

これは、 'LoginModule'であると主張しない理由がさらにあります。あなたはそれが何であるかに応じて、それぞれに異なる方法を呼び出す必要がありますか?あるいは、すべてが 'handle'メソッドを持っていることを保証するなど、すべてのインタフェースを強制することができますか? – Fenton

関連する問題