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

TypeScript如何从类型属性自动生成字符串作为计算属性实现排序

解决方案

首先纠正你现有代码的类型定义错误:你当前的SortBy是通过Pick得到的对象类型,并非属性名的字符串联合类型,这也是你函数类型报错的核心原因。

由于TypeScript是擦除式类型系统,所有类型信息会在编译为JavaScript时完全清除,因此不存在直接从编译时类型生成运行时字符串值的能力。我们可以通过「先定义运行时常量、再从常量推导类型」的方案实现只维护一份字段列表、类型自动同步的效果,完全不需要手动编写重复的常量对象:


实现步骤

  1. 定义运行时合法排序字段数组,用as const保留字面量类型
// 仅需要维护这一份字段列表即可
const SORT_BY_FIELDS = ["viewCount", "favoriteCount", "commentCount"] as const;
  1. 从常量数组推导SortBy类型,不需要手动写联合类型
// 等价于 type SortBy = "viewCount" | "favoriteCount" | "commentCount"
type SortBy = typeof SORT_BY_FIELDS[number];
  1. 编写排序函数,类型校验和默认值都可以正常工作
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:15:06