簡體   English   中英

在使用通用初始值設定項 function 時,如何讓 typescript 正確推斷類型?

[英]How do I have typescript have the type properly infered when using a generic initializer function?

我有一個 function 可以采用這樣的可調用形式的參數:

type Initial<T> = T | PromiseLike<T> | (() => T) | (() => PromiseLike<T>)

const usePromise = <T>(initial: Initial<T>): T => {
  let result: unknown = null
  
  /* ... */
  
  return result as T
}

如果initial的類型類似於Promise<number>PromiseLike<number> ,則 typescript 會正確地將T的類型推斷為number 但是,如果initial是 function 類型,如() => PromiseLike<number> ,則 typescript 將T推斷為PromiseLike<number> 例如:

// good:
const initial1 = new Promise<number>(() => null)
const result1 = usePromise(initial1)  // result1: number (OK)

// bad:
const initial2: () => PromiseLike<number> = () => new Promise(() => null)
const result2 = usePromise(initial2)  // result2: PromiseLike<number> (ERROR, should be number)

注意:顯然這些承諾永遠不會解決或拒絕,但這個問題純粹是關於類型推斷的。

如何讓 typescript 也正確推斷第二個示例中的類型?

該聯合提供了多個有效的推理目標。 單數T類型始終有效,並且 TypeScript 可能不會進行計算以查看(() => PromiseLike<T>)也是一個有效目標。 我們需要明確給出一個推理順序,讓編譯器首先檢查更具體的類型,例如(() => PromiseLike<T>) 我建議使用重載。

重載按順序解決。 第一個過載在第二個過載之前被檢查等等......

type Initial<T> = T | PromiseLike<T> | (() => T) | (() => PromiseLike<T>)

function usePromise<T>(initial: (() => PromiseLike<T>)): T
function usePromise<T>(initial: (() => T)): T
function usePromise<T>(initial: PromiseLike<T>): T
function usePromise<T>(initial: T): T
function usePromise<T>(initial: Initial<T>): T {
  let result: unknown = null
  
  /* ... */
  
  return result as T
}

操場

暫無
暫無

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

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