Typescript Array.map允许使用互换返回类型的其他属性



我将从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
}))

最新更新