我正在将从JSON加载的对象数组映射到已知类型的对象中。我使用了标准的array.map,但是我可以指定其他属性而不会出现编译器错误。但是,如果我在map函数中显式指定返回值类型,则编译器会禁止其他属性。
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
})
有人可以解释为什么编译器不抱怨第一个而不是第二个吗?还有另一种方法吗?谢谢!
答案 0 :(得分:1)
TypeScript是一种结构化类型的语言,这意味着除了具有文字对象的非常特殊的情况外,其他属性都不会被视为类型错误。可以在related issue中找到其原因。
还有另一种写方法,它虽然不那么冗长,但仍然可以为您提供所需的东西。这个想法是为映射函数添加一个显式的返回类型,以便文字对象的大小写被触发。在这种情况下,您也不需要在结果上添加注释:
const mapped3 = input.map((item): Foo => ({
name: item.name,
extra: true
}))