2016-05-16 50 views
0

假設此代碼:型模塊是不能分配給輸入的LoginModule

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

class LoginModule extends Module{ 
    start(){} 

} 

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

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

爲什麼我收到錯誤:

Type 'Module' is not assignable to type 'LoginModule'. Property 'start' is missing in type 'Module'.

我需要有從Module再延伸類對象的陣列我想打字稿來識別對象類型。

我可以改變

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

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

但隨後我會在IDE寬鬆智能感知提示。

回答

1

財產modules把定義是

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

所以,它肯定不是一個的LoginModule。但是,在情況下,我們知道實例的LoginModule,我們可以使用與斷言(在as語句)分配:

//var loginModule:LoginModule = server.modules[0]; 
var loginModule = server.modules[0] as 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

如果Server需要LoginModule,使需求明確的要求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類型。我懷疑你不希望每個模塊都是可交換的,而是希望某些類型的模塊是可交換的 - 所以在你的構造函數中允許一個或多個每種類型(我想象你正在瞄準從類似Express Express的中間件那裏,您可以允許用戶爲特定類型的事件指定一些處理程序)。

+0

這不適合我。在我的例子中,我知道模塊數組的第一個元素是「LoginModule」的一個對象。但在實際情況下,它只是隨機排列的10個或模式對象的數組,我只知道它們都是從一個基類擴展而來的。 – SET

+0

更有理由不斷言它是'LoginModule'。你需要根據它是什麼來調用不同的方法嗎?或者你可以強制執行一個接口,例如通過確保它們都具有「句柄」方法? – Fenton

相關問題