流量:计算属性。当类型为类时,在...中找不到可索引签名

问题描述 投票:3回答:1

如何在这种情况下修复错误(保持使用类作为类型):

/* @flow */

class Person {
  name: string;
  age: number;
}

const person: Person = new Person();
person.name = 'Bob';
person.age = 25;

['name', 'age'].forEach(key => {
  if(person[key]) {
    console.log(person[key]);
  }
});

该错误指向person[key]并说:

无法获取person[key],因为Person中缺少索引器属性

在类似的情况下(可能是不同的流程版本),它说:

计算属性。在Person中找不到可索引签名

javascript ecmascript-6 flowtype
1个回答
1
投票

我认为更大的问题是Array.prototype.forEach有这种类型

forEach(callbackfn: (value: T, index: number, array: $ReadOnlyArray<T>) => any, thisArg?: any): void;

https://github.com/facebook/flow/blob/3baafb0f2191353cd896d6fe087aea535bc8606e/lib/core.js#L211

您可以看到value参数的类型为T,它由数组中元素的类型决定。在你的情况下,Flow(很可能)假设数组['name', 'age']的类型为string[]。因此,类型T设置为string

现在,当您尝试访问person[key]时,Flow会抱怨您缺少索引器属性。这是准确的,因为您尝试在string实例上使用通用Person访问。即使在删除条件后,此问题仍然存在,这暗示Flow无法将string类型细化为'name''age'之一。

如果Flow可以改进这样的东西会很好

/* @flow */

class Person {
  name: string;
  age: number;
}

const person: Person = new Person();
person.name = 'Bob';
person.age = 25;

['name', 'age'].forEach(key => {
  if (key === 'name') {
    console.log(person[key]);
  }
});

不一定是因为它有用,但因为它是如此明确,并且应该是那时的安全访问。

我会尽量避免在属性列表中使用循环来获取/设置对象的属性,因为Flow不会处理像元组一样行动的数组的细微差别。此外,在对象的属性发生变化的情况下,循环遍历对象本身(例如,Object.keys)更具有前瞻性。

© www.soinside.com 2019 - 2024. All rights reserved.