簡體   English   中英

我想推斷 object 的鍵數

[英]I want to infer the number of keys of an object

我想推斷 object 的鍵數。

對於數組,這有效:

type LengthArray<T extends readonly any[]> = T["length"];
type Length = LengthArray<["ryan", 1, true, 90]>;
// Length is 4 :)

我正在嘗試從 object 執行此操作:

type LengthObject<T> = Array<keyof T>["length"];
type Length = LengthObject<{ name: string; age: number }>;
// Length is number :(

我需要知道在上面的界面中,屬性的數量正好是 2,而不是“數字”。

歸根結底,我最想知道的是object是否沒有屬性:

type LengthObject<T> = <?>

function infer<T>(o: T): LengthObject<T> extends 0 ? number : string {
    // ...
}
const r1 = infer({}); // r1 is number;
const r2 = infer({ name: "ryan" }); // r2 is string;

檢測 object 類型T是否沒有密鑰可以通過檢查keyof T是否為never來輕松完成。

function infer<T>(o: T): keyof T extends never ? number : string {
    return null!
}
const r1 = infer({}); // r1 is number;
const r2 = infer({ name: "ryan" }); // r2 is string;

獲取 object 類型的屬性數量的通用解決方案有點棘手。 我們可以分布T的鍵並構建一個元組,該元組為T中的每個屬性都有一個元素。 屬性的數量現在是元組的length

type LengthObject<T, K extends keyof T= keyof T> = [K] extends [never]
  ? []
  : K extends K ? [0, ...LengthObject<Omit<T, K>>] : never

type Length = LengthObject<{ name: string; age: number }>["length"]
//   ^? type Length = 2

請注意,當涉及索引簽名時,這兩種解決方案可能會或可能不會出現意外行為。


操場

暫無
暫無

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

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