簡體   English   中英

使用擴展時推斷 generics

[英]Inferring generics when using extends

今天,我遇到了這種類型:

interface Base {
  one: number;
  two: number;
}

export type SelectSubset<T, U> = {
    [key in keyof T]: key extends keyof U ? T[key] : never
}

type TQuestion = <T extends Base>(args: SelectSubset<T, Base>) => void

const example: TQuestion = (obj) => {}

我非常不確定為什么在這個例子中可以推斷出泛型T的類型。 我看到T被限制為 Base 但假設我必須為編譯器傳遞一個默認值才能確定 T 解析為什么。 我假設編譯器只是假設T具有未傳遞顯式類型的Base類型?

在您發布的代碼段中,編譯器不需要進行真正的推斷。

在這一行——

const example: TQuestion = (obj) => {};

您只定義了 TQuestion 類型的TQuestion ,此處無需進行推斷。 由於obj參數上沒有明確提及類型,因此它是從TQuestion類型中提取的。 這相當於-

function example<T extends Base>(obj: SelectSubset<T, Base>): void {}

如果你這樣做了——

const example = (obj) => {};

編譯器會抱怨obj缺少類型並且具有隱式any類型(假設您將“無隱式任何”設置設置為 true)。 這里,一個類型完全缺失,但是當你聲明exampleTQuestion類型時,你存儲在其中的 function應該是TQuestion類型,這就是obj參數自動獲取類型SelectSubset<T, Base>的原因

這些約束的實際推斷和類型檢查只有在您實際調用 function 時才會發揮作用。

暫無
暫無

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

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