2015-10-06 71 views
2

我正在嘗試爲我使用的庫編寫TypeScript定義。它有一個插件系統,除了插件以外,我無法控制它,必須擴展Plugin。所述PluginManager具有如下功能:參數是一個類的聲明函數,返回該類的一個實例?

add(plugin: any, ...parameters: any[]): any; 

哪裏參數插件是一類(Apple.Tree),並返回一個instanceof Apple.Tree。 Apple.Tree擴展插件。

有沒有什麼辦法讓這個泛型函數保持這種類型?

我嘗試這樣做:

add<T extends Plugin>(plugin: T, ...parameters: any[]): T; 

當我嘗試,雖然這個功能調用它,它說。 Argument of type "typeof Apple.Tree" is not assignable to parameter of type "Plugin"

它說在Apple.Tree中缺少一個屬性。但是,由於Apple.Tree擴展了插件,它正在抱怨那裏有一些東西。我有一種感覺,它可能與這個通用函數有關。

我將不勝感激任何意見。

+0

其實,我只注意到插件有一個構造'(遊戲:任何,父母?:任何)'。這可能是缺少的參考。但是,這爲我的問題增添了一層複雜性。也許不會,因爲'PluginManager'有它自己的'game'實例。而'parent'是'PluginManager'。所以這個函數不應該關心提供對這些參數的訪問。 – user1059939

回答

4

昨晚我剛剛在類似的問題上工作。這裏有一個例子,你可以適用於您的情況:

class Tree extends Plugin { 

} 

interface ConstructorOf<T> { 
    new(...args: any[]): T; // allow for constructors with any amount of parameters 
} 

function add<T extends Plugin>(plugin: ConstructorOf<T>, ...parameters: any[]) { 
    // create a new instance of plugin and pass in the parameters 
    return new plugin(...parameters); 
} 

var tree = add(Tree); // tree is typed as Tree and not typeof Tree 

Source

+0

我只想說感謝大衛,這完全符合我的所有測試。我曾經避開像核區一樣的插件! – user1059939

4

您可以指定參數plugin是一個類的構造函數與這種類型的約束:

class PlugIn { 
} 

class TestPlugIn extends PlugIn { 
} 

class PluginManager { 
    add<T extends PlugIn>(plugin: {new(): T; }, ...parameters: any[]): T { 
     return new plugin(); 
    } 
} 

var manager = new PluginManager(); 
var plugin = manager.add(TestPlugIn); 

我的唯一的事情在這裏沒有做的是將構造函數中的parameters通過。


{new(): T; }語法如下記載:TypeScript Handbook: Generics如果您向下滾動到標題爲「使用類類型的泛型」部分

+0

謝謝你的幫助Spike!其中一個時刻,這是混搭,你很好地梳理候選人的答案,就像你不應該成爲的法官! – user1059939

相關問題