从concat构建时,为什么TypeScript不会抱怨数组的类型?

时间:2017-05-24 19:50:03

标签: arrays typescript interface concat

在下面的代码中,我希望TypeScript编译器在.json()getThings_concat上都失败,但它只会抱怨后者:

getThings_nocats

这是一个编译器错误,但我预计会有两个错误(每个interface IThing { name: string; } function things1() { return [ {name: 'bob'}, {name: 'sal'}, ] } function things2() { return [ {garbage: 'man'}, ] } function getThings_concat():Array<IThing> { return <Array<IThing>>([].concat(things1(), things2())); } function getThings_nocats():Array<IThing> { let ret:Array<IThing> = []; things1().forEach(thing => { ret.push(thing); }); things2().forEach(thing => { ret.push(thing); }); return ret; } 函数一个错误):

getThings_*

我可以在test.ts(24,18): error TS2345: Argument of type '{ garbage: string; }' is not assignable to parameter of type 'IThing'. Property 'name' is missing in type '{ garbage: string; }'. 更改哪些内容,以便我可以使用getThings_concat,但在[].concat返回非things2()时让它抱怨?

1 个答案:

答案 0 :(得分:0)

通过将var arr = [ 1, 5, 9, 21 ], pairs = arr.reduce((p,c,i) => i == 1 ? [[p,c]] : p.concat([[p[p.length-1][1],c]])); console.log(pairs);的类型从[]更改为any[],这将为您提供所期望的错误:

IThing[]

然而,以这种方式编写函数会好得多,不需要任何类型的断言

function getThings_concat():Array<IThing> {
    return (<IThing[]>[]).concat(things1(), things2());
}