2015-07-22 172 views
0

Typescript中是否有任何方式捕獲不帶類型參數的泛型類?我基本上是試圖使像泛型類沒有泛型函數中的類型參數

interface Collection<T> { 
    ... 
} 

function map<T, U, V extends Collection>(collection:V<T>, fn:(e:T) => U):V<U> { 
    .... 
} 

在集合類工作在我的程序過程風格的地圖功能,但因爲編譯器希望我把一個類型參數的集合在地圖中的通用這不起作用名單。

本質上我想要類型檢查器知道如果我在List<T>上調用它,我會得到一個List<U>;稱之爲Set<T>,我得到Set<U>;這可能嗎?

感謝

回答

1

這是我對這個...

function map<T, U, V extends Collection<any>>(collection: V, fn:(e:T) => U) : Collection<U> { 
    return null; 
} 

妥協之一:V extends Collection<any>不能重複使用型T。理想情況下,您會使用T而不是any

妥協二:我們從函數返回不太具體的Collection<U>。理想情況下,您接受一般類型並返回一個特定的類型,因此這是一個妥協。

沒有妥協的版本。你需要一個在類型和輸出類型,你需要一個通用類,所以你可以在方法類型參數內重複使用類類型:

class Mapper<T, U> { 
    map<TIn extends Collection<T>, TOut extends Collection<U>>(collection: TIn, fn:(e:T) => U) : TOut { 
     return null; 
    } 
} 
+0

Currerntly我使用'函數映射(收集:收集 ,fn:(e:T)=> U):Collection {...}'',它以與第一個選項相同的類型信息結束,同時強制該集合由函數可以接受的類型組成,但我希望能讓它更具體。與第二種選擇相同,除了我需要在實例化Mapper時手動提供T和U類型,否則幾乎所有類型的信息都會丟失。 –