2017-05-24 1 views
1

は、私はtypescriptですコンパイラがgetThings_concatgetThings_nocatsの両方で失敗することを期待しかし、それは後者のみ文句を言う:私は2つのエラー(のための1つを期待するもののここなぜ文字列は配列から構築されたときに配列の型について文句を言わないのですか?次のコードで

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; 
} 

は、1つのコンパイラエラーです各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; }'. 

は、私が何を私が[].concatを使用できるようにgetThings_concatに変更するが、ときthings2()戻っ非IThingのそれは文句を言うことができますか?

+0

なぜ[[] .concat'を書いていますか? 'concat'は元の配列を変更しません。 'things1()。concat(things2())'を安全に書くことができます。あるいは '[... things1()、... things2()]'と書くだけです。 –

+0

@RyanCavanaugh私は可読性のために 'things1()。concat(things2())'が好きではありません( 'things1'が特別に見えるようにしました。)最後の方がよかったです。ありがとうございました – iffy

答えて

0

これはany[]IThing[]から[]の種類を変更することにより、あなたが期待するエラーを与える:

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

単にない機能をこのように、書くためにはるかに良いと思いますが任意の型アサーションが必要です

function getThings_concat2():Array<IThing> { 
    return [...things1(), ...things2()]; 
} 
+0

さて、しかし、私はおそらく、連結の結果をキャストしていたのでしょうか?とにかく、最後の構文が優れています。ありがとう! – iffy

関連する問題