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

时间:2018-09-20 11:13:28

标签: typescript

代码是:

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

我收到以下TS错误:

  

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

我在做什么错?这是错误吗?

13 个答案:

答案 0 :(得分:44)

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

const result : string[] = [];

答案 1 :(得分:14)

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

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

答案 2 :(得分:12)

我使用ReactJS useState钩在ReactJS函数组件中遇到了相同的错误。解决方案是在初始化时声明useState的类型:

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

答案 3 :(得分:10)

我找到的解决方案是

const [files, setFiles] = useState([] as any);

答案 4 :(得分:5)

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

const result = []

通常,您将其视为:

const result:any[] = []

但是,如果您在tsconfig中同时具有noImplicitAny为假, strictNullChecks为真,则将其视为:

const result:never[] = []

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

当您真正拥有any的数组时,就不需要用额外的代码来表示它。

答案 5 :(得分:1)

您需要在字符串result的数组中键入const result: string[] = [];

答案 6 :(得分:1)

另一种方法是:

it

答案 7 :(得分:1)

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

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

答案 8 :(得分:0)

我可以使用Array关键字而不是空括号来克服此问题:

const enhancers: Array<any> = [];

使用:

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

答案 9 :(得分:0)

另一个错误原因。

如果在使用connect()()包裹组件之后导出,则道具可能会出现打字错误
解决方案:我没有做太多探索,因为我可以选择使用useSelector钩子替换connect函数
例如

my_instance.class_variable

答案 10 :(得分:0)

错误:“any”类型的参数不能分配给“never”类型的参数。

在 tsconfig.json -

  "noImplicitReturns": false,

   "strictNullChecks":false,

enter image description here

解决方案:输入'never'

enter image description here

答案 11 :(得分:0)

您也可以添加as string[]

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

当它是对象的一部分时我就这样做了

let complexObj = {
arrData : [],
anotherKey: anotherValue
...
}
(arrData as string[]).push('text')

答案 12 :(得分:0)

如果您不知道将填充数组的值的类型,您可以这样做,result 将推断类型。

const result: any[] = []