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
相关产品推荐
相关产品推荐

