typescript 使用将数组类型转换为特定类型的泛型类型时出错

yh2wf1be  于 2023-03-31  发布在  TypeScript
关注(0)|答案(1)|浏览(155)

我正在学习新的打字概念,特别是我正在按照这些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类型系统的指南

4zcjmb1e

4zcjmb1e1#

我让它为你工作。
1.由于result是一个具体的对象,因此需要明确它的类型TupleToObject<Array<string | number>>
1.如果可以避免的话,不要使用as。它通常只用于跳过类型检查,这会破坏TypeScript的功能。
1.您丢失了类型收缩if (typeof key === "string")。如果没有类型收缩,您会得到以下错误:Type 'string | number' is not assignable to type 'never'.

type TupleToObject<T extends Array<string|number>> = { [P in T[number]]: P; };

const tupleToObject = <T extends Array<string | number>>(input: T): TupleToObject<T> => {
    let result: TupleToObject<Array<string | number>> = {};

    for (const key of input) {
        if (typeof key === "string") {
            result[key] = key;
        } else {
            result[key] = key;
        }
    }
    return result;
}

TSPlayground

相关问题