在我的情况下,TS为什么会出现以下错误:无法将类型“ number”的参数分配给类型“ never”的参数?

时间:2020-09-01 11:24:42

标签: reactjs typescript

我有以下代码:

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

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

ExpandedFiltersState = {[key:string]:string |片刻[] |数[] }

然后出现以下错误:

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

为什么?我该如何避免呢?

1 个答案:

答案 0 :(得分:1)

考虑以下更简单的示例:

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或number,则大于或等于时,include都必须是Moment&number的并集。

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

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

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

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