工厂模式
这个有点意思,本质上也是一种高阶函数的运用,即将自己的对外接口暴露为接受一个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这里就不一样。