我正在学习新的打字概念,特别是我正在按照这些challenges来实践我所学到的。
挑战:
给定一个数组,将其转换为对象类型,并且键/值必须在提供的数组中。
我的解决方案
type TupleToObject<T extends Array<string|number>> = { [P in T[number]]: P; };
我的疑问到目前为止一切顺利,但当我尝试使用这个新类型x1c 0d1x进行测试时
我在result[key]上得到这个错误:* “元素隐式地具有'any'类型,因为'string'类型的表达式|number'不能用于索引类型' TupleToObject '。在类型' TupleToObject '上找不到参数类型为'string'的索引签名。"*
我不明白为什么我在类型脚本编译器中有这个错误。我的类型没有定义字符串或数字类型的属性?
如果我使用let result = {}作为any,则错误消失。
理解错误和更好地理解typescript类型系统的指南
1条答案
按热度按时间4zcjmb1e1#
我让它为你工作。
1.由于
result
是一个具体的对象,因此需要明确它的类型TupleToObject<Array<string | number>>
。1.如果可以避免的话,不要使用
as
。它通常只用于跳过类型检查,这会破坏TypeScript的功能。1.您丢失了类型收缩
if (typeof key === "string")
。如果没有类型收缩,您会得到以下错误:Type 'string | number' is not assignable to type 'never'.
TSPlayground