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

时间:2021-07-02 23:44:37

标签: typescript

add edge 方法抛出这个错误。我不知道在这种情况下什么是永远!

TS2345:'string 类型的参数 | number' 不能分配给类型为 'never' 的参数。

.map_err(Into::into)

谢谢

1 个答案:

答案 0 :(得分:1)

问题在于你的类型

{ [key in string | number]: string[] | number[] }

表示每个键映射到 string[]number[],但没有说明它是哪个。因此,当您尝试推送一个键时,TypeScript 无法知道该键是适合数组的类型。例如,对于所有 TypeScript 所知,键可以是 string,但数组是 number[] ...

(当然,错误信息可能更清楚......)

您可以通过不同方式解决此问题。如果每个图都处理字符串或数字,但通常不是两者都处理,则可以使用泛型:

export class Graph<V extends string | number> {
  adjacencyList: { [key in V]?: V[] } = {};

  addVertex(vertex: V): void {
    this.adjacencyList[vertex] = [];
  }

  addEdge(vertex1: V, vertex2: V): void {
    this.adjacencyList[vertex1].push(vertex2);
    this.adjacencyList[vertex2].push(vertex1);
  }
}

(编译器仍然对你大喊大叫,因为可能在顶点之前添加了边,导致缺少数组。你可能想要更优雅地处理)

或者,如果您的图表通常包含数字和字符串的任何混合,您可以这样做:

export class Graph {
  adjacencyList: { [key in number | string]: (number | string)[] } = {};

  addVertex(vertex: number | string): void {
    this.adjacencyList[vertex] = [];
  }

  addEdge(vertex1: number | string, vertex2: number | string): void {
    this.adjacencyList[vertex1].push(vertex2);
    this.adjacencyList[vertex2].push(vertex1);
  }
}

相关的变化是顶点的 adjacencyList(number | string)[] 类型,即一个可以包含字符串和数字混合的数组。