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;
}
}