我想合并两个对象。将默认值作为基本模型并替换下一个对象中的所有值。但 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
并且仅包含level
为2
让我们合并默认值:
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/