TypeScript-元素隐式地具有“ any”类型,因为类型“ string”的表达式不能用于索引类型

测试:

假设我有这个:

const color = {
    red: null,
    green: null,
    blue: null
};

const newColor = ['red', 'green', 'blue'].filter(e => color[e]);

错误出现在color[e]底部附近:

元素隐式地具有“ any”类型,因为类型“ string”的表达式不能用于索引类型“ {red:null; 绿色:null;蓝色:null;}'。在类型“ {{红色:空;绿色:null;蓝色:null;}'。

我尝试在TypeScript文档中到处查找,但是我interface对此到底想怎么想,以便它可以接受color[e]

jcalz:

您遇到的问题不是那color是错误的类型,而是TypeScript推断了['red', 'green', 'blue']be 的类型string[]通常,这种类型的推断是可取的,因为(对于所有编译器都知道)您可能希望继续推论'purple'但是,在这种情况下,你想编译器知道的唯一成员是三个字符串文字'red''green''blue'也就是说,您需要至少与一样具体的类型Array<'red'|'green'|'blue'>

假设你正在使用TS3.4或更高版本,最简单的方法来获得这种类型推理的编译器是使用const断言

const constAssertionTest = ["red", "green", "blue"] as const;
// const constAssertionTest: readonly ["red", "green", "blue"];

as const导致编译器来推断一个元组正是数组中的三个字符串文字组成的,在你设置的确切顺序。(它甚至是一个只读的元组)。这足以解决您的错误:

const newColor = (['red', 'green', 'blue'] as const).filter(e => color[e]); // okay

好的,希望对您有所帮助。祝好运!

链接到代码

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章