【问题标题】:Argument of type is not assignable to parameter of type 'never'类型参数不可分配给“从不”类型的参数
【发布时间】:2021-07-02 23:44:37
【问题描述】:

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

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

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

谢谢

【问题讨论】:

  • 一个空数组从不[]。所以你需要把它添加到你的工会中
  • [key in string | number]: string[] | number[] --- 这最终是never[] 因为没有办法静态地确保您推送到键的所有值都是相同的类型。所以 TS 试图找出一个可分配给string[]number[] 的类型——即never[]。例如:g.addEdge('foo', 'bar'); g.addEdge('foo', 42);
  • @zerkms 谢谢,伙计们。我知道什么永远不会。但那我该怎么办?
  • 您可以在一个属性中存储数字列表,在另一个属性中存储字符串列表。
  • adjacencyList的类型改成{ [key in string | number]: (string | number)[] }?

标签: typescript


【解决方案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)[] 类型,即可以包含字符串和数字混合的数组。

【讨论】:

    猜你喜欢
    • 2019-10-17
    • 2019-06-24
    • 2021-06-14
    • 2018-08-10
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多