0

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

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。有人可以帮我吗?

4

1 回答 1

0

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

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

操场

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

于 2021-12-27T15:09:19.067 回答