簡體   English   中英

如何從函數類型推斷默認泛型參數?

[英]How to infer default generic parameter from a function type?

如何提取函數的默認類型參數以編譯類似此語句的內容?

const fails: string = "" as ReturnType<<T = string>() => T>;

ReturnType<<T = string>() => T>unknown的,而不是string

type F = <T = string>() => T;

type X = ReturnType<F>;
// type X = unknown 😢

根據microsoft/TypeScript#42064

默認值僅適用於不存在推理候選者的直接調用期間

這意味着只有當您直接調用<T = string>() => T類型的函數並且正常類型推斷失敗時, T泛型參數默認值(如string )才重要。 但是ReturnType<F>實際上並沒有調用函數,它只是檢查F的類型並推斷其返回類型。 由於T實際上可以是任何東西,因此編譯器不知道它實際上是什么。 它將T替換為其(隱式)約束, unknown type

據我所知,如果不調用該類型的函數,就無法從泛型函數類型中獲取默認值。 條件類型推斷不起作用:

type Y = F extends <T = infer U>(...args: any) => any ? U : never;
// type Y = unknown 😢

你可以假裝調用這種類型的函數,但這很討厭。 就像是:

let r;
if (false as true) {
  // won't actually happen but the compiler doesn't know this 
  const f = null! as F;
  r = f();
} else {
  r = null!
}
type Z = typeof r; // string

根據您的用例,您可能會擺脫類似的情況,但對於大多數目的,我會說通用默認值在類型系統中幾乎是不可觀察的。

Playground 代碼鏈接

暫無
暫無

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

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