Typescript:类型映射类型不能与原始类型一起索引

Typescript:类型映射类型不能与原始类型一起索引,typescript,type-mapping,Typescript,Type Mapping,我正在编写一个实例化的类,该类有一个返回类型为对象的方法,该对象的键来自编译器推断的泛型类型。由于编译器告诉我泛型类型U不能按类型T索引,我发现下面的代码片段有问题——我认为这是不正确的,因为U是使用T进行类型映射的,因此T总是能够索引U类型的对象。有没有一种方法可以向编译器确认这种情况 最小代码段: 类动态转换格式{ 构造函数(私钥:T[]){} public returnObject():U{ 常量obj={}as U; for(此.keys的常量键){ obj[键]=“测试”; //错误T

我正在编写一个实例化的类,该类有一个返回类型为对象的方法,该对象的键来自编译器推断的泛型类型。由于编译器告诉我泛型类型
U
不能按类型
T
索引,我发现下面的代码片段有问题——我认为这是不正确的,因为
U
是使用
T
进行类型映射的,因此T总是能够索引
U
类型的对象。有没有一种方法可以向编译器确认这种情况

最小代码段:

类动态转换格式{
构造函数(私钥:T[]){}
public returnObject():U{
常量obj={}as U;
for(此.keys的常量键){
obj[键]=“测试”;
//错误TS2536:类型“T”不能用于索引类型“U”。
}
返回obj;
}
}
根据Rich N.的回答,该课程将按如下方式使用:

声明常量输入:缓冲区;
常量fmt=[“长度”、“packetID”、…];
const handshakeParser=新数据解析器(fmt);
const decodedObject=握手器解码(输入);

对于上下文:
DynamicReturnFormat
DataParser
returnObject
decode
。我希望
decodedObject
有一个非“一刀切”的类型,它只包含传递到类实例化中的属性。

不太清楚您希望如何使用它,但我猜您希望这样做:

const keys = ["a", "b", "c"];
const drf = new DynamicReturnFormat(keys);
const result = drf.returnObject();
那么结果应该是{a:“测试”,b:“测试”,c:“测试”}

如果是这样,下面的代码可以工作。我必须取出第二个泛型变量U,并使用一个分部变量,因为{}不可分配给类型{[key in T]:string}:

class DynamicReturnFormat<T extends string> {
    constructor(private keys: T[]) { }

    public returnObject(): { [key in T]: string } {
        const obj: Partial<{ [key in T]: string }>= {};

        for (const key of this.keys) {
            obj[key] = "test";
        }

        return obj as { [key in T]: string };
    }
}

谢谢你,里奇!您所提供的代码工作正常,这是正确的,但是我不喜欢a)以
{[key in T]:string}
的形式重复写出类型签名,或者b)使用
{[key:string]:string}
,因为我希望对象具有受约束的类型签名以便于调试。我已经更新了原来的问题来演示用例。@StanStrum您只需要在示例中编写一次<代码>常量obj={}作为{[P in T]:字符串}。编译器将流式处理该类型。
T
generic确实在这里添加了值,它确定了
returnObject
返回的对象的属性。你的第一个解决方案就是要走的路。
class DynamicReturnFormat {
    constructor(private keys: string[]) { }

    public returnObject(): { [key: string]: string } {
        const obj: { [key: string]: string } = {};

        for (const key of this.keys) {
            obj[key] = "test";
        }

        return obj;
    }
}