当我合并具有任意数量的键的两个对象时,属性的类型在合并中被覆盖。我怎么用typescript来表达呢?
const a: {[propName: string]: string | number | boolean} = {
a: 1,
b: 2,
c: true
}
const b: {[propName: string]: string } = {
c: "2"
}
const c: {[propName: string]: string | number } = { ...a, ...b };此示例显示了typescript错误,即使c的类型签名是正确的。
发布于 2018-11-27 22:35:53
如果像对a和b那样显式地键入可由string索引的变量,则Typescript将不会跟踪您在object文字中分配的键(毕竟它们都无关紧要,对象可由任何字符串索引),因此它无法知道该属性是否会在排列中被覆盖。
如果让编译器推断a和b的类型,所有这些都将按预期工作:
const a = {
a: 1,
b: 2,
c: true
}
const b = {
c: "2"
}
const c: {[propName: string]: string | number } = { ...a, ...b }; // ok now since the compiler knows that `c` in `a` will be overwritten如果您想定义由另一个类型约束的对象文字(例如,在这里,它们由索引签名约束),但您还想保留对象文字的实际类型,您可以使用一个函数来实现:
function constrain<T>() {
return function <U extends T>(o: U) {
return o
}
}
const a = constrain<{ [propName: string]: string | number| boolean }>()({
a: 1,
b: 2,
c: true
})
const b = constrain<{ [propName: string]: string }>()({
c: "2"
})
const c: {[propName: string]: string | number } = { ...a, ...b };发布于 2018-11-27 22:41:08
如果需要合并typescript中的对象,可以使用lodash
var object = {
'a': [{ 'b': 2 }, { 'd': 4 }]
};
var other = {
'a': [{ 'c': 3 }, { 'e': 5 }]
};
_.merge(object, other);
// Output:
// { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }https://stackoverflow.com/questions/53501974
复制相似问题