typescript - 类型参数不可分配给“从不”类型的参数
问题描述
添加边缘方法抛出此错误。我不知道在这种情况下永远不会发生什么!
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);
}
}
谢谢
解决方案
问题是你的类型
{ [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)[]
,即一个可以包含字符串和数字混合的数组。
推荐阅读
- c++ - 无法将二维字符数组传递给函数(C++)
- javascript - “owl-carousel-o”不适用于角度 11 中的模型
- javascript - 在 Angular 10 上安装 draw2d 最新版本
- razorpay - Razorpay 付款错误:由于商家问题,此付款失败
- excel - VBA:文本识别 - 将特定列从 sheet1 复制到 sheet2
- python - 错误:-socket.gaierror:[Errno 11001] getaddrinfo 在获取请求中失败
- r - 计算大型数据集中在一小时内发生的动物之间的距离
- javascript - 如何设置我的不和谐机器人的状态和存在?
- awk - 使用 awk 在循环中搜索多个模式
- c# - 尝试从 C# 获取时本地计算机注册表项值不匹配