[英]Why are missing type parameters inferred as unknown in TypeScript?
如果省略,為什么調用中的泛型類型參數會被推斷為unknown
類型(或約束類型)。 康德,
function doStuff<T>(): T {
return {} as any as T;
}
const result = doStuff();
我希望doStuff
的調用是一個錯誤,因為缺少類型參數。 相反,它推斷為unknown
所以result
的類型是unknown
。 為什么? 如果 T 有一個約束,那么result
的類型就是約束類型。
我可以理解默認值很有用,但 TypeScript 具有通用參數的默認機制。 這是一個歷史性的掛斷還是什么想法?
我正在使用 TypeScript 3.9。
這是一個與此類似的問題,但我問的是為什么(不假設它不正確),這個例子更簡單。
在(越來越過時的)TypeScript 規范中記錄了“如果候選參數類型集為空,則推斷的T
類型參數是T
的約束。” 所以這是有意的,但你想知道為什么。 我假設您不希望我的意見關於為什么不發出錯誤可能是有用的行為,所以我能做的最好的事情就是看看 TS 團隊是否有任何記錄在案的討論。
次要問題:在 TypeScript 3.5 中,泛型類型參數的隱式約束從{}
更改為unknown
。 這只是我能找到的唯一問題的一些背景:
有microsoft/TypeScript#360 ,如果類型推斷產生{}
則要求發出錯誤。 問題描述主要討論存在多個非重疊類型推斷候選者並且編譯器一直擴大到類似頂部的類型以找到“最佳通用超類型”的情況。 這不是您的問題,並且此問題已在 TypeScript 中通過使用聯合並在類型不相關時防止聯合推斷得到解決。
但在這條評論中,討論切換到沒有候選人時該怎么辦。 應該是錯誤嗎? Aaand,這就是我在該問題中所能找到的。 該問題得到解決,沒有在一組空的候選人上出錯,並且該建議被關閉為“拒絕”。
還有microsoft/TypeScript#2511再次要求這個。 它在此評論中作為選項 2 提到:“在推斷{}
時給出錯誤,因為沒有推理候選者。我們之前已經討論過這個選項,但它從未真正獲得太多關注,但我們可以重新審視。” 也許甚至在一個現已刪除的名為downWithDreadedCurlyCurly
的分支中完成了一些工作。 但是這個問題最終會被關閉,因為一個切向相關的問題修復了部分問題(使用上下文類型從返回類型中添加候選者)。
最后是microsoft/TypeScript#5254 ,再次要求這個,一些討論來回進行,但沒有任何結果。
就是這樣了。 這是有意的; 有些人不久前認為應該有所不同; 這個想法沒有得到太多的關注; 它被遺棄了。 這些都沒有真正說明為什么首選當前行為。 答案很可能是慣性; 它對人們來說效果很好,那些有問題的人可以通過其他方式解決他們的問題。
如果有人能找到一個更規范的答案,我會很想看到它。 祝你好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.