【问题标题】:Typescript class with index signature from passed type具有来自传递类型的索引签名的打字稿类
【发布时间】:2022-01-26 11:06:11
【问题描述】:

我是打字稿的新手,我正在尝试正确定义一个类,将某种类型的对象转换为具有相同属性的类。但是,我无法正确定义此类上的键,因为它们是通用的:

interface RawAnswer {
  __typename: string;
  id: string;
  meta: Record<string, unknown>;
}

class TrackedAnswer<T> {
  // This doesn't work:
  // [K in keyof T]: T<K>

  constructor(obj: T) {
    Object.entries(obj).forEach(([key, value]) => {
      // this is just an example, I'm aware that this is useless
      this[key] = value;
    });
  }
}

const raw: RawAnswer = { __typename: "StringAnswer", id: "123", meta: {} };
const answer = new TrackedAnswer(raw);

在这种情况下,我希望 TrackedAnswer 类具有与 RawAnswer 相同的索引签名。有人可以帮帮我吗?

【问题讨论】:

    标签: typescript index-signature


    【解决方案1】:

    我发现自己多次需要这种模式,这就是解决它的方法:

    class TrackedAnswer<T extends TrackedAnswer<T>> {
      constructor(e: T) {
        Object.keys(e).forEach((k) => {
          // @ts-ignore
          this[k] = e[k];
        });
      }
    }
    
    class Answer extends TrackedAnswer<Answer> {
      public __typename!: string;
      public id!: string;
      public meta!: Record<string, unknown>;
    }
    
    const raw: Answer = { __typename: "StringAnswer", id: "123", meta: {} };
    const answer = new Answer(raw);
    

    playground

    如果你想通过 npm 使用它,它也包含在我的 typescript helper 库中:https://github.com/Olian04/typescript-helpers/blob/master/src/lib/record.ts

    【讨论】:

    • 所以没有办法绕过中间类来适应正确的类型?
    • @JonasMetzener 可能有。但这就是我解决它的方法。
    猜你喜欢
    • 2019-02-10
    • 2018-12-15
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 2021-05-20
    • 2019-05-23
    • 2017-09-07
    • 1970-01-01
    相关资源
    最近更新 更多