工廠模式
這個有點意思,本質上也是一種高階函式的運用,即將自己的對外介面暴露為接受一個key和func<key,V>。這裡的key即是當前func的元素,V是C#型別宣告定義下的輸出型別。工廠內部會根據傳入的內容進行操作,而這種自己不執行而是把函式交給工廠執行的方式就叫做委託。也是字面意思,我不弄,只給你key和func,剩下的你自己弄。
輕量級的工廠模式只有方法,但更標準的則是直接傳一個類進去了。
// C# 直接用內建的 Func,不用自己定義
TValue GetOrAdd(TKey key, Func<TKey, TValue> factory)
// TS 直接用箭頭函數類型,也不用定義
function getOrAdd<TKey, TValue>(key: TKey, factory: (key: TKey) => TValue): TValue
然後介面的用法也可以
// 用 interface 定義
interface Factory<TKey, TValue> {
(key: TKey): TValue; // 調用簽名語法
}
// 函數類型,返回值在箭頭右邊,不在 <> 裏
// 仔細看會發現,這裏的形式其實跟上面的接口差不多,括號指代函數
type Func<TKey, TValue> = (key: TKey) => TValue;
(key: TKey): TValue 本身用()包住意味著這是個函式,同時用TValue宣告它的返回型別。但對於整個介面來説,這些型別必須外部傳入,因此才有<TKey, TValue>。這個地方其實容易弄混,C#的Func型別,預設會把最後一個泛型作為輸出型別,但ts這裡就不一樣。