打字稿中的“无法分配给永不类型的参数”错误是什么?


162

代码是:

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

我收到以下TS错误:

[ts]类型'string'的参数不能分配给'never'类型的参数。

我究竟做错了什么?这是一个错误吗?

Answers:


251

您所要做的就是将您result的字符串数组定义为如下所示:

const result : string[] = [];

如果不定义数组类型,则默认为never。因此,当您尝试向其中添加字符串时,这是类型不匹配,因此引发了您看到的错误。


6
在我看来这很奇怪,为什么默认为never[]?除了“永远将为空的数组”以外,还有什么用?
Vincent Buscarello

6
我完全同意,因为说实话,我认为用例never不会有用s 数组。但是,在研究时,我遇到了这个答案,它具有很好的信息。
Tha'er M. Al-Ajlouni,

8
默认类型不应该是“ any”吗?声明变量(let x;)时any,默认情况下为类型。不never
沙迦·夏舒夫(Shachar Har-Shuv),

1
肯定会希望没有类型的数组为any[]。感到惊讶的是never[],这使它毫无用处。不直观 感谢你的回答。编辑:语法
伊戈尔·马里克

4
我猜@VincentBuscarello,这种默认设置的主要目的是使一个总是将类型添加到其数组中。但是错误消息绝对没有帮助。
YakovL

27

另一种方法是:

const result = [] as  any;

8
实际使用any不是一个好的选择,因为它基本上会关闭所有TypeScript功能。这是一种解决方法,可能会导致各种错误。
Tomek Buszewski

1
是。但有时没有其他作品尤其是当你与第三方库的工作..
neomib

14

这似乎是最近的回归或打字稿中的某些奇怪行为。如果您有代码:

const result = []

通常,您将其视为:

const result:any[] = []

但是,如果您的tsconfig中同时具有noImplicitAnyFALSE和AND strictNullChecks TRUE,则将其视为:

const result:never[] = []

这种行为违抗所有逻辑,恕我直言。启用空检查会更改数组的条目类型?然后开启noImplicitAny实际上会恢复使用,any而不会发出任何警告?

当您真正拥有的数组时any,您无需使用其他代码来表示它。


10

我在使用ReactJs Hook useState时在ReactJS无状态函数中 遇到相同的错误。我想设置对象数组的状态,所以如果我使用以下方式

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

并像这样更新状态:

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

我收到错误消息:

类型为'{id:number;的参数。文本:任何}'都不能分配给'never'类型的参数

但是如果这样

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

错误消失了,但是索引0的项目没有任何数据(不需要)。

所以我找到的解决方案是:

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

删除真:“strictNullChecks”“compilerOptions”或将其设置为false在tsconfig.json您伍应用程序文件。这些错误将像任何东西一样消失,您的应用程序将成功编译。

免责声明:这只是一种解决方法。仅当未正确处理空值检查时才会出现此错误,这在任何情况下都不是完成工作的好方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.