首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeScript:替换对象属性类型

TypeScript:替换对象属性类型
EN

Stack Overflow用户
提问于 2018-11-27 22:31:29
回答 2查看 2.1K关注 0票数 1

当我合并具有任意数量的键的两个对象时,属性的类型在合并中被覆盖。我怎么用typescript来表达呢?

代码语言:javascript
复制
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的类型签名是正确的。

EN

回答 2

Stack Overflow用户

发布于 2018-11-27 22:35:53

如果像对ab那样显式地键入可由string索引的变量,则Typescript将不会跟踪您在object文字中分配的键(毕竟它们都无关紧要,对象可由任何字符串索引),因此它无法知道该属性是否会在排列中被覆盖。

如果让编译器推断ab的类型,所有这些都将按预期工作:

代码语言:javascript
复制
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

如果您想定义由另一个类型约束的对象文字(例如,在这里,它们由索引签名约束),但您还想保留对象文字的实际类型,您可以使用一个函数来实现:

代码语言:javascript
复制
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 };
票数 0
EN

Stack Overflow用户

发布于 2018-11-27 22:41:08

如果需要合并typescript中的对象,可以使用lodash

代码语言:javascript
复制
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 }] }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53501974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档