typescriptの「never typeのパラメータに割り当てられない」エラーとは何ですか?


162

コードは:

const foo = (foo: string) => {
  const result = []
  result.push(foo)
}

次のTSエラーが発生します。

[ts]タイプ 'string'の引数は、タイプ 'never'のパラメーターに割り当てることができません。

何が悪いのですか?これはバグですか?

回答:


251

あなたがしなければならないのはresult、次のようにあなたを文字列配列として定義することだけです:

const result : string[] = [];

配列タイプを定義しないと、デフォルトでになりますnever。文字列を追加しようとすると、型の不一致が発生したため、表示されたエラーがスローされました。


6
それは私には奇妙に思えます、なぜデフォルトにnever[]?「常に空になる配列」以外の用途はありますか?
Vincent Buscarello、

6
正直なところ、neversの配列が役立つユースケースは考えられないので、私は完全に同意します。しかし、それを調べている間に、私はこの答えに出くわしました。それは素晴らしい情報を持っています。
Tha'er M. Al-Ajlouni

8
デフォルトのタイプは「任意」にすべきではありませんか?変数(let x;)を宣言すると、anyデフォルトで型になります。ないnever
Shachar Har-Shuv

1
型のない配列がであることを間違いなく期待しますany[]。それはnever[]それが役に立たなくなるので驚いた。直感的ではありません。答えてくれてありがとう。編集:文法
Igor Malyk

4
@VincentBuscarelloおそらく、そのようなデフォルトの主なポイントは、常に配列に型を追加することです。しかし、エラーメッセージは間違いなく役に立ちません。
YakovL

27

別の方法は:

const result = [] as  any;

8
anyTypeScriptの機能が基本的にオフになるため、実際に使用することは適切なオプションではありません。これは回避策であり、さまざまなバグにつながる可能性があります。
Tomek Buszewski、

1
はい。しかし、時には他には何もサードパーティのライブラリを使用して作業しているとき...特に機能しない
neomib

14

これは最近の回帰か、typescriptの奇妙な動作のようです。コードがある場合:

const result = []

通常は、次のように扱われます。

const result:any[] = []

ただし、tsconfigにnoImplicitAnyFALSE strictNullChecks TRUEの両方がある場合は、次のように扱われます。

const result:never[] = []

この行動はすべての論理に反します、IMHO。nullチェックをオンにすると、配列のエントリタイプが変更されますか?そして、オンnoImplicitAnyにすると、any警告なしでの使用が実際に復元されますか?

本当にの配列がanyある場合、追加のコードでそれを示す必要はありません。


10

ReactJsフックのuseStateを使用しているときに、ReactJS statless関数で 同じエラーが発生しました。オブジェクト配列の状態を設定したかったので、次の方法を使用した場合

const [items , setItems] = useState([]);

次のように状態を更新します。

 const item = { id : new Date().getTime() , text : 'New Text' };
 setItems([ item , ...items ]);

エラーが発生しました:

タイプ '{id:number;の引数 テキスト:任意の} 'は、タイプ' never 'のパラメーターに割り当てることができません

このようにすると

const [items , setItems] = useState([{}]);

エラーはなくなりましたが、インデックスがないアイテムがあり、データがありません(必要ありません)。

だから私が見つけた解決策は:

const [items , setItems] = useState([] as any);

7

ReactJSのuseStateフックを使用して、ReactJS関数コンポーネントで同じエラーが発生しました。解決策は、初期化時にuseStateのタイプを宣言することでした。

const [items , setItems] = useState<IItem[]>([]); // replace IItem[] with your own typing: string, boolean...

3

空の角括弧の代わりにArrayキーワードを使用することで、これを回避することができました。

const enhancers: Array<any> = [];

使用する:

if (typeof devToolsExtension === 'function') {
  enhancers.push(devToolsExtension())
}

2

result文字列の配列を入力する必要がありますconst result: string[] = [];



1

「compilerOptions」から「strictNullChecks」:trueを削除するか、Ngアプリのtsconfig.jsonファイルでfalseに設定します。これらのエラーは通常どおり解消され、アプリは正常にコンパイルされます。

免責事項:これは単なる回避策です。このエラーは、nullチェックが適切に処理されない場合にのみ発生します。これは、いずれにしても、適切な方法ではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.