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

TypeScript如何声明泛型对象参数中值为string类型的key类型?

问题描述

我正尝试为不同类型的对象数组创建一个自定义排序函数,希望它具备足够的通用性,能处理至少包含一个string属性的多种类型对象。

目前我写的代码如下:

interface Record {
  id: string
  name: string
}


const sortStr = (field: keyof Record, reverse: boolean) => {
  return (a: Record, b: Record) =>
    a[field] !== "" && b[field] !== ""
      ? (reverse ? -1 : 1) *
        a[field].localeCompare(b[field], undefined, { sensitivity: "base" })
      : a[field] !== "" && b[field] === ""
      ? -1
      : a[field] === "" && b[field] !== ""
      ? 1
      : 0
}

我想知道能不能把参数field的类型声明为任意对象中值为string类型的key?

举个例子,如果Record包含number类型的属性,上面的函数就无法正常工作,因为localeCompare是字符串的专属方法:

interface Record {
  id: string
  name: string
  user: number
}
解决方案

参考caTS的答案修改后,以下实现可行:

type KeysOfType<O, T> = {
  [K in keyof O]: O[K] extends T ? K : never
}[keyof O]

const sortStr = (field: KeysOfType<any, string>, reverse: boolean) => {
  return (a: any, b: any) => 
    a[field] !== "" && b[field] !== ""
      ? (reverse ? -1 : 1) *
        a[field].localeCompare(b[field], undefined, { sensitivity: "base" })
      : a[field] !== "" && b[field] === ""
      ? -1
      : a[field] === "" && b[field] !== ""
      ? 1
      : 0
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:35:24