首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Typescript:无法使用原始类型对类型映射类型进行索引

Typescript:无法使用原始类型对类型映射类型进行索引
EN

Stack Overflow用户
提问于 2020-08-10 00:26:04
回答 1查看 119关注 0票数 2

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

最小代码段:

代码语言:javascript
复制
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.的回答,这个类的用法如下:

代码语言:javascript
复制
declare const input: Buffer;

const fmt = ["length", "packetID", ...];
const handshakeParser = new DataParser(fmt);

const decodedObject = handshakeParser.decode(input);

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-11 01:20:18

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

代码语言:javascript
复制
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}:

代码语言:javascript
复制
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并没有增加太多价值。如果您希望以某种方式约束传递给构造函数的数组,我不认为可以这样做(?)。所以下面的代码可能更好:

代码语言:javascript
复制
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;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63328745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档