[英]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
。
這種算法稱為多余的屬性檢查
Object 文字在將它們分配給其他變量或將它們作為 arguments 傳遞時得到特殊處理並進行過多的屬性檢查。 如果 object 文字具有“目標類型”沒有的任何屬性,您將收到錯誤消息:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.