繁体   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