簡體   English   中英

TypesScript:為什么 keyof {} 沒有類型?

[英]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.

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