簡體   English   中英

帶有泛型的 TypeScript 接口函數類型

[英]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 來散列PersonEmployee以及EquipmentRoom

我不能將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM