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