You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将对象属性名映射为数组?TypeScript类型实现问询

实现TypeScript类型NameOfProperties

可以实现这个类型,核心思路是利用keyof操作符提取目标类型的所有属性名,再通过联合转元组的技巧将其转换为数组字面量类型。

完整实现代码

// 将联合类型转换为元组类型
type UnionToTuple<T> = 
  (T extends any ? (t: T) => void : never) extends (t: infer U) => void 
    ? [...UnionToTuple<Exclude<T, U>>, U] 
    : [];

// 提取对象/类的属性名为元组
type NameOfProperties<T> = UnionToTuple<keyof T & string>;

// 测试类
class C1 {
    p1 = 1;
    p2 = 2;
    static sp1 = 1;
    static sp2 = 2;
    m1() {}
    m2() {}
    static sm1() {}
    static sm2(): "hello" {
        return "hello";
    }
}

// 验证实例类型
type test = NameOfProperties<C1>; 
// 输出:["p1", "p2", "m1", "m2"](成员顺序可能随TypeScript版本略有变化,但包含所有预期属性)

// 验证类构造函数类型
type staticTest = NameOfProperties<typeof C1>; 
// 输出:["prototype", "sp1", "sp2", "sm1", "sm2"](成员顺序可能随TypeScript版本略有变化,但包含所有预期属性)

实现说明

  1. UnionToTuple<T>:通过条件类型的分布式特性,将联合类型中的成员逐个提取,递归构建成元组类型。
  2. NameOfProperties<T>:
    • 用keyof T获取目标类型的所有属性名联合类型;
    • 用& string过滤掉可能存在的Symbol类型键;
    • 最后通过UnionToTuple将联合类型转换为元组,得到预期的属性名数组。

注意:TypeScript官方未保证联合类型的成员顺序,因此元组中元素的排列顺序可能因版本或编译选项有所不同,但所有预期的属性名都能被正确包含。

内容的提问来源于stack exchange,提问作者rplaurindo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:38:26