TypeScript如何从类型属性自动生成字符串作为计算属性实现排序
解决方案
首先纠正你现有代码的类型定义错误:你当前的SortBy是通过Pick得到的对象类型,并非属性名的字符串联合类型,这也是你函数类型报错的核心原因。
由于TypeScript是擦除式类型系统,所有类型信息会在编译为JavaScript时完全清除,因此不存在直接从编译时类型生成运行时字符串值的能力。我们可以通过「先定义运行时常量、再从常量推导类型」的方案实现只维护一份字段列表、类型自动同步的效果,完全不需要手动编写重复的常量对象:
实现步骤
- 定义运行时合法排序字段数组,用
as const保留字面量类型
// 仅需要维护这一份字段列表即可 const SORT_BY_FIELDS = ["viewCount", "favoriteCount", "commentCount"] as const;
- 从常量数组推导
SortBy类型,不需要手动写联合类型
// 等价于 type SortBy = "viewCount" | "favoriteCount" | "commentCount" type SortBy = typeof SORT_BY_FIELDS[number];
- 编写排序函数,类型校验和默认值都可以正常工作
function sortNades(nades: Nade[], sortBy: SortBy = "viewCount") { // 如果需要运行时参数校验可以加这行 if (!SORT_BY_FIELDS.includes(sortBy)) { throw new Error(`非法排序字段:${sortBy}`); } return [...nades].sort((a, b) => b[sortBy] - a[sortBy]); }
方案优势
- 所有排序字段只需要维护一次,修改时只需要改
SORT_BY_FIELDS数组,类型会自动同步 - 不需要额外定义重复的键值对常量对象
- 支持编译时类型校验 + 可选的运行时参数校验
- 完全符合你要求的
sortBy仅能传入指定字段、默认值为viewCount的效果
内容的提问来源于stack exchange,提问作者Nermin
相关产品推荐
相关产品推荐

