簡體   English   中英

TypeScript 的類型推斷

[英]TypeScript's type inference

鑒於以下這些類型,我不確定為什么executor.get()的推斷類型會根據我調用console.log的方式而有所不同。

為了您的方便,我提供了 TypeScript 游樂場的鏈接

interface Stage<T, R> {
  consume(element: T): void;
}

function peek<T>(action: (element: T) => void): Stage<T, T> {
  return {
    consume(element: T) {
      action(element);
    }
  };
}

class Executor<T> {
  run<A>(stage1: Stage<T, A>): Executor<A>;
  run<A, B>(stage1: Stage<T, A>, stage2: Stage<A, B>): Executor<B>;
  run(...stages: Stage<any, any>[]): Executor<any> {
    return this;
  }

  get(): T {
    return null as T;
  }
}

如果我peek(element => console.log(element)) ,那么推斷的get()返回類型是正確的number

const executor = new Executor<number>();

executor.run(
  peek(element => console.log(element))
).get();

但是如果我像下面那樣peek(console.log) ,那么推斷的get()的返回類型是我不明白為什么的any類型。 我認為因為 console.log 的簽名是console.log console.log(...data: any[]): void ,所以當我像下面這樣傳遞對console.log的引用時, TypeScript 推斷element的類型是any ,但我想要number ,我應該怎么做才能讓 TypeScript 推斷出正確的類型?

const executor = new Executor<number>();

executor.run(
  peek(console.log)
).get();

console.log具有以下類型log(message?: any, ...optionalParams: any[]): void; . 因此,當調用console.log時, peek將推斷Tany類型(這是 console.log 的第一個參數的類型)。 要解決此問題,您需要手動告訴 peek 您將期待一個數字:

const executor = new Executor<number>();

executor.run(
  peek<number>(console.log)
).get();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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