首页 > 解决方案 > 类型参数不可分配给“从不”类型的参数

问题描述

添加边缘方法抛出此错误。我不知道在这种情况下永远不会发生什么!

TS2345:“字符串”类型的参数 | number' 不可分配给“从不”类型的参数。

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

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

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

谢谢

标签: typescript

解决方案


问题是你的类型

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

表示每个键映射到 astring[]或 a number[],但没有说明它是哪个。因此,当您尝试按下某个键时,TypeScript 无法知道该键是适合数组的类型。例如,据 TypeScript 所知,键可能是 a string,但数组 a 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)[],即一个可以包含字符串和数字混合的数组。


推荐阅读