我正在编写一个实例化的类,它有一个方法,它的返回类型是一个对象,其键来自编译器推断的泛型类型。我遇到了以下代码片段的问题,因为编译器告诉我泛型类型U不能由类型T索引--我认为这是不正确的,因为U是使用T进行类型映射的,因此T总是能够索引U类型的对象。有没有办法向编译器确认是这种情况?
最小代码段:
class DynamicReturnFormat<T extends string, U = { [ key in T ]: string }> {
constructor(private keys: T[]) {}
public returnObject(): U {
const obj = {} as U;
for (const key of this.keys) {
obj[key] = "test";
// error TS2536: Type 'T' cannot be used to index type 'U'.
}
return obj;
}
}根据Rich N.的回答,这个类的用法如下:
declare const input: Buffer;
const fmt = ["length", "packetID", ...];
const handshakeParser = new DataParser(fmt);
const decodedObject = handshakeParser.decode(input);对于上下文:DynamicReturnFormat为DataParser,returnObject为decode。我希望decodedObject有一个非“一刀切”的类型,它只包含传递到类实例化中的属性。
发布于 2020-08-11 01:20:18
现在还不清楚您希望如何使用它,但我猜您希望这样做:
const keys = ["a", "b", "c"];
const drf = new DynamicReturnFormat(keys);
const result = drf.returnObject();那么结果应该是{a:"test",b:"test",c:"test“}?
如果是这样的话,下面的代码可以工作。我不得不去掉第二个通用变量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 };
}
}上面的代码可以工作,但我认为泛型T并没有增加太多价值。如果您希望以某种方式约束传递给构造函数的数组,我不认为可以这样做(?)。所以下面的代码可能更好:
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;
}
}https://stackoverflow.com/questions/63328745
复制相似问题