分配类型以动态访问对象值

Assigining type to dynamically accessed object values

我创建了一个 class,它有 2 个属性存储带有数字的元组数组。我还创建了一个动态访问这些属性的方法“getIndex”,然后检查是否存在包含相同数字的元组。该函数如下所示:

  getIndex(posX: number, posY: number, pathArr: string) {
    for (let routeCoordinates of this[pathArr]) {
      if (routeCoordinates[0] === posX && routeCoordinates[1] === posY) {
        return this[pathArr].indexOf(routeCoordinates);
      }
    }
  }

问题是每当我尝试将 pathArr 作为键传递时,我都会收到以下错误消息:

"Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'PathfinderSecondStage'. No index signature with a parameter of type 'string' was found on type 'PathfinderSecondStage'."

我知道泛型,但我在互联网上找到的解决方案在处理 class 实例时不起作用。有没有保持类型检查的解决方案?

如果没有完整的代码,就不可能知道 this[] 指的是什么,但是您可以通过将 Typescript 数组声明为 let ARRAY: { [key: string]: DTYPE; } = {}; 来允许使用字符串对其进行索引,其中 ARRAY 是您的数组名称DTYPE 是您存储的数据类型。

直接解决方案非常简单。您需要做的就是将 pathArr: string 参数更改为 pathArr: keyof PathfinderSecondStage,这将导致 TypeScript 在 class 中创建所有 public fields/methods 的联合类型,然后提取 this[pathArr] 语句并在类型断言的帮助下将其分配给一个变量,以告诉它将要使用的确切类型:

 getIndex(posX: number, posY: number, pathArr: string) {
    const myArray = this[pathArr] as number[][];
    for (let routeCoordinates of myArray) {
      if (routeCoordinates[0] === posX && routeCoordinates[1] === posY) {
        return myArray.indexOf(routeCoordinates);
      }
    }
  }

您还可以通过专门定义包含可在函数内遍历的数组的字段名称来进一步缩小 pathArr 参数允许的变量范围,如下所示: getIndex(posX: number, posY: number, pathArr: 'fieldName1'|'fieldName2') {

这将减少 TypeScript 创建联合类型所需的类型数量,如果它们都是数字数组 (number[][]),则无需执行类型断言,如中所示第一个例子。