TypeScript array.map允许具有返回类型为interred的其他属性

时间:2018-12-19 19:31:44

标签: typescript

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

有人可以解释为什么编译器不抱怨第一个而不是第二个吗?还有另一种方法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

TypeScript是一种结构化类型的语言,这意味着除了具有文字对象的非常特殊的情况外,其他属性都不会被视为类型错误。可以在related issue中找到其原因。

还有另一种写方法,它虽然不那么冗长,但仍然可以为您提供所需的东西。这个想法是为映射函数添加一个显式的返回类型,以便文字对象的大小写被触发。在这种情况下,您也不需要在结果上添加注释:

const mapped3 = input.map((item): Foo => ({
    name: item.name,
    extra: true
}))