我将从JSON加载的对象映射到已知类型的对象。我使用了标准数组。映射,但是我能够在没有编译器错误的情况下指定其他属性。但是,如果我在地图函数中明确指定返回值类型,则编译器禁止其他属性。
interface Foo {
name: string
}
const input: any[] = [{ name: 'Jen' }]
// Compiles. But 'extra' is not in Foo and Foo[] is the specified return type.
const mapped1: Foo[] = input.map((item) => ({
name: item.name,
extra: true
}))
// Does not compile. But this is excessively verbose.
const mapped2: Foo[] = input.map((item) => {
const output: Foo = {
name: item.name,
extra: true
}
return output
})
有人可以解释为什么编译器不抱怨第一个而不是第二个?还有另一种方法吗?谢谢!
typeScript是一种结构键入的语言,这意味着除了具有文字对象的非常具体的情况外,额外的属性不被视为类型错误。可以在相关问题中找到原因。
还有另一种写作的方法,它的详细信息较少,但仍然可以为您带来想要的东西。这个想法是为映射函数添加一个明确的返回类型,以便字面对象案例触发。在这种情况下,您也不需要结果注释:
const mapped3 = input.map((item): Foo => ({
name: item.name,
extra: true
}))