簡體   English   中英

Typescript 推斷基於預期的 function 類型參數

[英]Typescript inference based on the expected function type parameters

type DateFormat = {
  year: "numeric";
}

function calculateDate (dateFormat: DateFormat) {
  /**
   * 
   */
}

const format = {
  year: "numeric"
}



calculateDate(format)

沙盒

目前在 Typescript 4.2 中, format的推斷類型定義為:

{
    year: string;
}

這與 function 調用 ( calculateDate ) 中的預期類型別名DateFormat不匹配,因為string類型的 year 屬性不如字符串文字numeric那樣具體。

但是,如果我直接從 function 調用中傳遞了format object 參數,則 TS 似乎能夠在調用的上下文中推斷類型 - 並根據 DateFormat 正確驗證類型。

calculateDate({
  year: "numeric"
})

因此,我想知道這是 Typescript 推理算法能力的限制,還是語言的主動設計決策?

您必須使用const 斷言as const

const format = {
  year: "numeric"
} as const;

從文檔中引用:

當我們用 const 斷言構造新的文字表達式時,我們可以向語言發出信號:

  • 不應該擴大該表達式中的文字類型(例如,不要從“hello”變為字符串)
  • object 文字獲取只讀屬性數組
  • 文字變成只讀元組

游樂場鏈接

要回答評論中的問題:
是的,這是一個設計決策,因為有寬和緊類型的用例。

我們想要寬類型的一個例子是這樣的:

function foo(opts = {
  color: 'blue'
}) {}

foo({
  color: 'green'
})

在這種情況下,我們希望color屬性是string類型,而不是blue

游樂場示例 2

這種算法稱為多余的屬性檢查

Object 文字在將它們分配給其他變量或將它們作為 arguments 傳遞時得到特殊處理並進行過多的屬性檢查。 如果 object 文字具有“目標類型”沒有的任何屬性,您將收到錯誤消息:

暫無
暫無

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

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