![](/img/trans.png)
[英]Why does `keyof any` have type of `string | number | symbol` in typescript?
[英]TypesScript: Why does keyof {} have the type never?
當應用於空的 object 時,我對keyof
運算符感到困惑。 示例代碼:
const o = {};
const k : Array<keyof typeof o> = [];
// k has type never[]
為什么類型never
? 我認為 never 是永遠不會返回的函數的返回類型。 類型不應該是any[]
嗎?
像這樣更改 object 時,類型有意義:
const o = {a: 1, b: 2};
const k : Array<keyof typeof o> = [];
// k has the type ("a" | "b")[]
我在實現返回 object 的鍵入鍵的 function 時發現了這種行為:
function getKeys(o: object) {
return Object.keys(o) as Array<keyof typeof o>;
}
function 有返回類型never[]
但如果我是正確的,實際上應該有(keyof typeof o)[]
編輯:好的,所以,更新后問題對我來說更清楚了。 這里的問題是您沒有使用 generics,因此您實際上是在向 TS 詢問object的密鑰,而不是某些 object的密鑰。
您可以這樣重新排列 function:
function getKeys<O extends {}>(o: O) {
return Object.keys(o) as Array<keyof O>;
}
這樣它將接受 O 類型的通用object,在這種情況下, keyof O
將准確鍵入Array<keyof O>
。 例如:
const keys = getKeys({ a: 1, b: 2 });
// Now keys has type ("a" | "b")[]
帖子編輯前的舊答案:
never
表示永遠不會出現的值,如TS Doc中所述。 就是這種情況,因為 object 中沒有鍵。 為了更好地理解它,來自 TS Doc 的聲明可能會有所幫助:
never 類型是每個類型的子類型,並且可以分配給每個類型;
這意味着,在這種情況下,never 正確地是字符串的子類型,尤其是“沒有字符串”和“沒有鍵”的意思。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.