typescript - 在 TypeScript 中合并两个对象,无需检查键是否存在

标签 typescript ecmascript-6

我想合并两个对象。将默认值作为基本模型并替换下一个对象中的所有值。但 TypeScript 对我的类型抛出错误。

我有这个对象:

const grades = {
  "grade": {
    "level": 1,
    "state": 1,
    "grade": "B"
  },
  "level": {
    "id": 1,
    "name": "Level 1"
  }
}

我有一个适合他们的类型:

export type UserLGType = typeof grades
export type GradeType = typeof grades.grade

现在在其他地方我声明一个这样的变量:

const x: UserLGType = grades // get all values as default

现在,我的问题是,我从数据库中获取了一些值。让我们假设这是来自数据库的等级:

const gradesFromDB: any = { "level": 2 }

如您所见,它的any并且仅包含level2

让我们合并默认值:

x.grade = {...x.grade, gradesFromDB}

预期结果:

   {
      "grade": {
        "level": 2, // see here..
        "state": 1,
        "grade": "B"
      },
      "level": {
        "id": 1,
        "name": "Level 1"
      }
    }

实际结果:

Object literal may only specify known properties, and 'gradesFromDB' does not exist in type '{ "level": number; "state": number; "grade": string; }'.

在此处查看演示:https://repl.it/repls/BusyAccomplishedData

现在,我如何合并这两个对象?我可以循环,但它将是一个很大的数据集,所以有没有一种快速且安全的方法来做到这一点?只需获取默认值,然后从数据库更改值。

最佳答案

你需要这样做:

x.grade = {...x.grade, ...gradesFromDB}

gradesFromDB 上的扩展运算符将属性提取到新对象中。正如您所拥有的,您正在为新对象分配一些属性“gradesFromDB”该值。

但是,您应该停止执行这些简写类型声明并编写实际的接口(interface):

export interface GradeType {
  level: number;
  state: number;
  grade: string; // maybe better like: 'A'|'B'|'C' etc 
}

export interface UserLGType {
  grade: GradeType;
  level: {
    id: number;
    name: string;
  }
}

然后用它们来输入内容:

const DEFAULT_GRADE: UserLGType = {
  "grade": {
    "level": 1,
    "state": 1,
    "grade": "B"
  },
  "level": {
    "id": 1,
    "name": "Level 1"
  }
}

const gradesFromDB: Partial<GradeType> = { "level": 2 }

关于typescript - 在 TypeScript 中合并两个对象,无需检查键是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59042478/

相关文章:

javascript - TypeScript 和 Angular,执行顺序在这

javascript - 如何渲染部分内部模板

javascript - ES6 Map 迭代成本

Javascript "for of"值转换不持久

javascript - 箭头函数中 "this"的可见性

node.js - 错误 TS2339 : Property 'use' does not exist on type express "Application"

javascript - TypeScript- NodeJS - 意外的标记; 'constructor, function, accessor or variable'

TypeScript 2.1+ tsconfig 扩展

javascript - ES2015 "import"在带有 --harmony_modules 选项的 Node v6.0.0 中不工作

Javascript,添加构造函数的类