首页 > 解决方案 > 为什么 TS 在我的情况下会出现以下错误:“数字”类型的参数不可分配给“从不”类型的参数?

问题描述

我有以下代码:

<CriterionCheckbox
  key={exp.value}
  checked={expandedFilters.experience.includes(exp.value)}
  title={exp.label}
  width='25%'
  onChange={() =>
  handleExpandedFilter(
  exp.value,
  expandedFilters.experience as number[],
  'experience',
    )
}
  />

我也有这种类型,它是用上面代码中的第三个字符串设置的。

ExpandedFiltersState = { [键:字符串]:字符串 | 时刻[] | 数字[] }

我收到以下错误:

“数字”类型的参数不能分配给“从不”类型的参数

为什么?我怎样才能避免它?

标签: reactjstypescript

解决方案


考虑以下更简单的示例:

interface Moment {
  prop1: string;
}

const z:  Moment[] | number[] = [];
z.includes(1)

// TS2345: Argument of type '1' is not assignable to parameter of type 'Moment & number'.   
// Type '1' is not assignable to type 'Moment'.

// Signature of includes in this case:
Array<T>.includes(     
  searchElement: Moment & number,     
  fromIndex: number | undefined): boolean

请注意,如果 z 可以是 Moment 或数字,那么对于在任何一种情况下都成功的包含,searchElement 必须是 Moment 和数字的并集

现在,让我们看一下您的示例:

expandedFilters.experience 
// type is string | Moment[] | number[]

Typescript 再次尝试合并元素类型。由于字符串不是数组,所以这是不可能的。

因此,它将 searchElement 的类型推断为 never。


推荐阅读