2017-03-01 88 views
1

我想定義就像flowtype:如何通過參數計數/類型來重載函數返回類型?

function first(n?: number) { 
    if (number === undefined) { 
    // returns a single Item 
    return items[0]; 
    } 

    // returns an array of Item 
    return items.slice(0, n); 
} 

一個重載函數,以便這些語句類型檢查:

const item: Item = first(); // no args, so return type is Item 
const items: Array<Item> = first(5); // number arg, so return type is Array<Item> 

流動人都知道,first第一個電話會導致n === undefined(因爲它會抱怨如果undefined對於n無效)並且它理解它將採用if分支,所以我認爲它可以推斷返回類型爲Item,但是我試過的所有東西都可以讓任何事情通過或總是失敗。

任何想法,如果這是可能的?在此先感謝互聯網。

回答

1

我沒有給你一個完整的解決方案,但我得到了中途有:

const items = [1, 2, 3]; 

type FirstType = ((_: void) => number) & ((n: number) => Array<number>); 

const first: FirstType = (n?: number) => { 
    if (n === undefined) { 
    // returns a single Item 
    return (items[0]: any); 
    } else { 
    // returns an array of Item 
    return (items.slice(0, n): any); 
    } 
} 

const a: number = first(); 
const b: Array<number> = first(2); 

tryflow

&交叉路口類型,這意味着first必須滿足這兩種類型的。您可以看到撥打first()的呼叫按您的方式進行了類型檢查。

不幸的是,它似乎並不像Flow目前能夠檢測到first的主體。請注意,我必須通過any來返回值以逃避類型檢測。如果你願意放棄函數體內的類型檢查,至少可以在函數調用的地方找到它。

+0

是啊...那工作!我不能說我真的明白你爲什麼需要'任何'演員......但它的工作。謝謝。我也不知道那個「tryflow」頁面,這對於擺弄非常有用。 – nrser

+0

只是一個警告,通過任何鑄造是不安全的。你不會得到返回值的類型檢查。 –