Skip to content

ObjectKeys ​

按照 Object.keys 返回的形式,将对象的键创建为联合类型。与 keyof 不同,数字键会被转换为字符串,符号键会被排除,与 JavaScript 中对象键始终为字符串的运行时行为一致。

typescript
type Keys = ObjectKeys<T>;

用法 ​

ObjectKeys<T> ​

当你需要与 Object.keys、Object.entries 或 for...in 循环在运行时实际产生的值一致的键类型时使用。在为 Object.keys 的结果添加类型时特别有用,因为 TypeScript 默认会将其扩宽为 string[]。

typescript
import type { ObjectKeys } from 'es-toolkit/types';

// keyof 将数字键保留为数字,而 ObjectKeys 将其转换为字符串。
type Keys = ObjectKeys<{ a: number; 1: string }>; // 'a' | '1'
type KeyofKeys = keyof { a: number; 1: string }; // 'a' | 1

// 为 Object.keys 的结果添加类型。
const obj = { a: 1, b: 2 };
const keys = Object.keys(obj) as Array<ObjectKeys<typeof obj>>; // Array<'a' | 'b'>

// 字符串枚举成员会保持为枚举类型,而不会被拓宽为字符串字面量。
enum Status {
  Active = 'active',
  Inactive = 'inactive',
}
type EnumKeys = ObjectKeys<Record<Status, number>>; // Status

// 索引签名会解析为其字符串形式。
type StringKeys = ObjectKeys<Record<string, number>>; // string
type NumberKeys = ObjectKeys<Record<number, string>>; // `${number}`

// 与 Object.keys 的运行时行为一样,符号键会被排除。
declare const sym: unique symbol;
type NoSymbols = ObjectKeys<{ a: number; [sym]: string }>; // 'a'

类型参数 ​

  • T: 要读取键的对象类型。

采用 MIT 许可证发布。