[英]TypeScript Interface function type with generics
我最近在一個開源存儲庫中發現了以下代碼字節:
interface Use<I, C = context<I>> {
<O>(fn: avvio.Plugin<O, I>, options?: O): C;
}
簡化為:
interface F<A> {
<B>(foo: A, bar: B): A;
}
我將如何調用B
泛型?
我正在努力尋找它的示例用法,即使在 TS Playground 中我也無法理解它。 我把這段代碼放在一個操場上,你可以在這里查看。
它是一個接受泛型參數的函數的接口。 下面是一個例子:
const funcTwo: F<string> = <T>(foo: string, bar: T) => {
return `${foo} ${bar}`;
}
console.log(funcTwo('Hello', 7));
更新:添加一個實際示例,可以說明它為什么有用。 很難想出一個沒有上下文的例子,但這是我最好的嘗試,不用考慮太多:
class UniqueCounter<T> {
private underlyingSet = new Set<T>();
constructor(
private hashingFunc: <V>(value: V) => T,
) {
}
add<V>(thing: V) {
const hash = this.hashingFunc(thing);
this.underlyingSet.add(hash);
}
count() {
return this.underlyingSet.size;
}
}
這個類試圖計算你有多少個獨特的東西。 但是,默認集使用===
對象,這不是我想要的。 相反,我對我的特定對象有某種散列算法。 雖然,在某些情況下我散列成一個字符串,而在其他情況下我散列成一個數字(我散列成的東西是T
)。
我不能將V
添加到類泛型中,因為這樣它就只能計算一種類型的對象。 也許我可以使用我分配給所有這些類的某種唯一 ID 來散列Person
和Employee
以及Equipment
和Room
。
我不能將T
添加到散列函數的類型參數中,因為我需要使用T
來定義underlyingSet
。
更新2:
忽略之前的更新,因為它與手頭的問題無關。 您顯示的類型:
interface F<A> {
<B>(foo: A, bar: B): A;
}
不等同於:
interface F<A, B> {
(foo: A, bar: B): A;
}
假設我們有一個哈希工廠工廠,可以神奇地創建哈希對象,但它們只能哈希到一種類型的鍵中。 換句話說,你可以創建一個“hash any to string”對象或一個“hash any to number”對象。 我們可以將類定義為:
class HashingFactory<T> {
createHasher<V>(): Hasher;
}
但是,返回類型是什么? 我們將如何定義Hasher
? 如果我們將其定義為:
interface Hasher<K, V> {
hash(value: V): K;
}
然后我們正在創建一些只能散列一種類型的輸入的東西(例如,它只能將 Employee 散列成數字)。 但是我們神奇的散列器可以將任何對象散列成一個數字。 正確的界面是:
interface Hasher<K> {
<V>hash(value: V): K;
}
現在我們可以正確地表示一個可以將 Employee 或 Room 或 Person(或其他任何東西)轉換為數字的對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.