键入已知类型的记录

时间:2019-03-21 23:09:29

标签: typescript

我有以下界面:

export interface IWatchEventPayload<T> {
  value?: T;
  paths?: IMultiPathUpdates[];
  changed?: IWatchEventChanges<T>;
}

我希望changed属性是/已经发生变化的属性的词典。从键入的角度来看,该想法是要确保字典的键都是 T 的属性。这是我第一次尝试的方法:

export interface IWatchEventChanges<T, K extends keyof T> {
  [prop: K]: [T[K], T[K]];
}

我曾希望这样做可以给我键入hash属性,并确保也键入“ before”和“ after”值。遗憾的是,这导致在[prop: K]中指出prop必须是字符串或数字的错误。实际上,它将始终是一个字符串,因此我执行了以下操作:

export interface IWatchEventChanges<T, K extends keyof T> {
  [prop: Pick<K, string>]: [T[K], T[K]];
}

但是现在保留了原始错误,现在我也得到了string类型的以下信息:

  

类型'string'不满足约束'keyof K'。     类型'string'不能分配给类型'“ toString” | “ valueOf””。

事情变得凌乱,我有点卡住了。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

无法作为interface来执行此操作,但是您可以改用mapped type并通过type alias为其命名,这样更加灵活。您想要的定义可能类似于:

export type IWatchEventChanges<T> = {
  [K in keyof T]: [T[K], T[K]];
}

希望有所帮助;祝你好运!