将语言数组用作Mongoose Schema键报计算属性名类型错误如何解决
报错原因及解决方案
错误根源
- 计算属性位置直接传入了
languageSelector函数对象,而非函数执行后的返回值,函数对象不属于string/number/symbol类型,直接触发类型报错 - 原有
languageSelector逻辑存在缺陷:循环第一次迭代就返回第一个数组元素,只能拿到单个语言值,无法生成所有语言对应的Schema键 - 语言数组中存储的字符串存在多余前后空格,会生成不符合规范的字段名
修正代码
常量文件修正
// constant.ts const languages = [ "Albanian", "Amharic", " Arabic ", " Armenia", " Azerbaij", " Basque ", " Belarusi", " Bengali ", " Bosnian ", " Bulgaria", " Catalan ", " Cebuano", " Chinese", ] // 生成所有语言对应Schema字段的工具方法 export function generateLanguageFields() { const languageFields = {} languages.forEach(lang => { // 清理字符串前后多余空格 const cleanLangName = lang.trim() languageFields[cleanLangName] = [ { startTime: { type: String, }, endTime: { type: String, }, text: { type: String, }, }, ] }) return languageFields }
Schema文件修正
import * as mongoose from "mongoose"; import { visibilityPlugin } from "./plugins/visibility"; import { generateLanguageFields } from "./constant"; const ObjectId = mongoose.Schema.Types.ObjectId; export const TranscriptSchema = mongoose.Schema({ // 展开所有生成的语言字段到Schema配置中 ...generateLanguageFields(), confidenceLevel: { type: Number, }, videoRef: { type: ObjectId, required: true, ref: "videos", }, });
方案说明
- 遍历所有语言批量生成对应字段的配置对象,无需手动逐个定义语言字段
- 通过对象展开运算符
...将批量生成的字段合并到Schema的根配置中,符合Mongoose的定义规则 - 自动清理语言名称的前后空格,避免生成带多余空格的非法字段名
- 直接将生成的字符串作为键,符合计算属性名的类型要求,不会再触发类型报错
内容的提问来源于stack exchange,提问作者sambhav jain
相关产品推荐
相关产品推荐

