[英]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.