2017-07-18 38 views
2

寫一個僅接受特定類的類裝飾器的正確方法是什麼?如何在打字稿中輸入類裝飾器?

我試過如下:

class Component { 
    age: number; 
} 

function registerComponent(name: string) { 
    return <T extends Component>(constructor: T): T => { 
    return constructor as T; 
    } 
} 

@registerComponent("demo") 
class C1 extends Component { 

} 

導致:

Argument of type 'typeof C1' is not assignable to parameter of type 'Component'. 
    Property 'age' is missing in type 'typeof C1'. 

Try in TypeScript Repl

回答

2

什麼獲取傳遞給裝飾器的類型,而不是類型的實例。話說constructor: T意味着constructor必須T類型的實例,所以不是你要告訴它的參數和結果都是構造函數的類型T

class Component { 
    age: number; 
} 

function registerComponent(name: string) { 
    return <T extends Component>(constructor: new() => T): new() => T => { 
    return constructor; 
    } 
} 

@registerComponent("demo") 
class C1 extends Component { 

} 

,你會獲得額外+1包括如果可以的話,打字稿可以複製。讓我很容易檢查我的答案。

請注意,您可能還需要指定構造函數參數。