如何使用.sort()对TypeScript Model按FieldMap的键排序?
问题分析与解决方案
首先,你遇到的TS2349错误原因很明确:你的fields是FieldMap类型,也就是一个索引签名对象({ [key: string]: Field }),而sort()是数组的专属方法,对象本身并没有这个方法,所以直接调用.fields.sort()肯定会报错。
正确的解决步骤
要给FieldMap里的内容排序,你需要先把对象转换成键值对数组,排序后再根据需求决定是保持数组形式,还是转回对象:
1. 按对象的key(也就是你代码里的a.key)排序
// 假设你的Model实例是model const model: Model = { fields: { b: { name: "B" }, a: { name: "A" }, c: { name: "C" } } }; // 将FieldMap转为[key, Field]的数组,然后按key排序 const sortedFieldEntries = Object.entries(model.fields).sort(([keyA], [keyB]) => { if (keyA < keyB) return -1; if (keyA > keyB) return 1; return 0; }); // 如果需要转回FieldMap对象(需要ES2019及以上环境支持Object.fromEntries) const sortedFields: FieldMap = Object.fromEntries(sortedFieldEntries);
2. 按Field的name属性排序
如果你是想按Field自身的name字段排序,而不是对象的key,可以这样写:
const sortedFieldEntries = Object.entries(model.fields).sort(([_, fieldA], [__, fieldB]) => { // 可以加toLowerCase()实现不区分大小写排序 const nameA = fieldA.name.toLowerCase(); const nameB = fieldB.name.toLowerCase(); if (nameA < nameB) return -1; if (nameA > nameB) return 1; return 0; });
为什么原来的代码报错?
你的.fields.sort(...)中,fields是对象类型,TypeScript明确知道对象没有sort方法,所以抛出了“Cannot invoke an expression whose type lacks a call signature”的错误——本质就是调用了一个不存在的方法。
内容的提问来源于stack exchange,提问作者Unkind
相关产品推荐
相关产品推荐

