在Typescript中映射时,动态地将属性分配给类型化对象的数组

时间:2018-02-05 17:27:45

标签: typescript

这有一个错误:

interface TypeA {
  prop1: string
}
interface TypeB extends TypeA {
  prop2: string
}
const ArrA: TypeA[] = [{ prop1: "foo" }]
const ArrB: TypeB[] = ArrA.map(a => {
  a.prop2 = "bar"
  return a
})

这会出错:[ts] Property 'prop2' does not exist on type 'TypeA'.

我希望在我的界面定义(like in this Stackoverflow question from 5 years ago)中不使用any的情况下执行此操作。我在Stackoverflow上找不到任何其他解决方案,所以我在这里提出这个问题。

2 个答案:

答案 0 :(得分:1)

这个怎么样:

const ArrB: TypeB[] = ArrA.map(a => {
  return {
    ...a,
    prop2: "bar"
  }
})

答案 1 :(得分:0)

我需要使用as关键字进行投射,并在prop2上添加TypeA作为可选参数:

interface TypeA {
  prop1: string;
  prop2?: string;
}
interface TypeB extends TypeA {
  prop2: string;
}
const ArrA: TypeA[] = [{ prop1: "foo" }];
const ArrB: TypeB[] = ArrA.map(a => {
  a.prop2 = "bar";
  return a as TypeB;
});

这是我能找到的最好的解决方案,会欣赏更多惯用的解决方案,1)不涉及修改TypeA,2)不涉及使用any。谢谢。