2016-12-08 20 views
3

考慮以下幾點:當你調用了一些如何定義修飾器的類型以防止丟失裝飾函數的類型信息?

// @flow 

function a(s: string): ?string { 
    return s === '' ? null : s 
} 

function decorate(f: Function): Function { 
    return f 
} 

const b = decorate(a) 

a(12) 
b(12) 

流拋出一個錯誤,而不是當你擁有多項

13: a(12) 
     ^^ number. This type is incompatible with the expected param type of 
3: function a(s: string): ?string { 
        ^^^^^^ string 

調用B是有這樣一種方式,你可以做像

function decorate(f: Function): typeof(f) { 
    return f 
} 

使得裝飾功能正常typechecks沒有明確限制裝點什麼樣的回報

function decorate(f: Function): (string) => ?string {} 

或複製像

const b: typeof(a) = decorate(a) 

回答

2

你需要讓功能polymorphic本B上的類型信息:

function decorate<T: Function>(f: T): T { 
    return f 
} 
+0

正是我想要的感謝! – m0meni

1

可以參數化的功能:

function decorate(f: Function): Function { 
    return f; 
} 

可以是

function decorate<T>(f: T): T { 
    return f; 
} 

說:「結果的類型與輸入類型相同。

+0

感謝您的回答!你們幾乎同時回答,但是@vkurchatkin表明我可以用''專門化參數化,這樣它只能是一個函數,沒有別的東西,所以我選擇了一個。 – m0meni

+0

沒問題。我離開它,因爲你從來沒有說過你需要做的功能:) – loganfsmyth