簡體   English   中英

申報單是否會影響TypeScript類型扣除?

[英]Should the declaration order affect TypeScript type deduction?

似乎 TypeScript 的翻譯器在某種程度上依賴於聲明的順序,至少在重載函數的情況下。

假設我們有 2 維和 3 維向量的類:

class Vector2 {
  public get x() : number
  public get y() : number
}
class Vector3 {
  public get x() : number
  public get y() : number
  public get z() : number
}

我們有一個重載的 function 接受Vector2Vector3

function add(a : Vector2, b : number) : Vector2;
function add(a : Vector3, b : number) : Vector3;

根據add()的哪個簽名首先出現 - 使用Vector2Vector3結果 - 編譯器可能會推斷出不同類型的結果,即使我們將Vector3作為參數傳遞也是如此。 例如,在與上述相同的順序的情況下,以下代碼:

const r = add(new Vector3, 5)

將返回Vector2而不是Vector3 因此,如果我們將r的可能類型限制為Vector3

const r : Vector3 = add(new Vector3, 5)

代碼不會編譯。

應該是這樣嗎? 因為對我來說,這看起來像是翻譯器的錯誤。

這是 Typescript 的預期行為:當您調用重載的 function 時,編譯器會選擇在調用點兼容的第一個重載簽名,而不是最具體的簽名。 文檔

TypeScript 在解析 function 調用時選擇第一個匹配的重載 當早期的重載比后面的“更通用”時,后面的重載被有效地隱藏並且不能被調用。

由於您的Vector3Vector2結構子類型,因此Vector3重載簽名更具體,因此您應該在Vector2重載簽名之前編寫該簽名。

暫無
暫無

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

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