能否将对象属性名映射为数组?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版本略有变化,但包含所有预期属性)
实现说明
UnionToTuple<T>:通过条件类型的分布式特性,将联合类型中的成员逐个提取,递归构建成元组类型。NameOfProperties<T>:- 用
keyof T获取目标类型的所有属性名联合类型; - 用
& string过滤掉可能存在的Symbol类型键; - 最后通过
UnionToTuple将联合类型转换为元组,得到预期的属性名数组。
- 用
注意:TypeScript官方未保证联合类型的成员顺序,因此元组中元素的排列顺序可能因版本或编译选项有所不同,但所有预期的属性名都能被正确包含。
内容的提问来源于stack exchange,提问作者rplaurindo
相关产品推荐
相关产品推荐

