web-dev-qa-db-ja.com

TypeScriptは、連結を使用して配列を削減するときに「never」型を推測するのはなぜですか?

コードは言語よりも優れているので、

['a', 'b', 'c'].reduce((accumulator, value) => accumulator.concat(value), []);

コードは非常にばかげており、コピーされた配列を返します...

TSはconcatの引数について不平を言います:TS2345:タイプ 'string'の引数はタイプ 'ConcatArray'のパラメーターに割り当てることができません。

14
pirix-gh

これは、[]の型がnever[]であると推論されているためだと思います。これは、空でなければならない配列の型です。型キャストを使用してこれに対処できます。

['a', 'b', 'c'].reduce((accumulator, value) => accumulator.concat(value), [] as string[]);

TypeScriptは、それを使って何をするかに基づいて空の配列に割り当てるためのより適切な型を見つけるのに適切な仕事をするので、通常、これはそれほど問題にはなりません。しかし、あなたの例はあなたが言うように「ばかげている」ので、TypeScriptは推論を行うことができず、型をnever[]のままにします。

18
Matt H