我有以下界面:
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””。
事情变得凌乱,我有点卡住了。有人可以帮忙吗?
答案 0 :(得分:2)
无法作为interface
来执行此操作,但是您可以改用mapped type并通过type
alias为其命名,这样更加灵活。您想要的定义可能类似于:
export type IWatchEventChanges<T> = {
[K in keyof T]: [T[K], T[K]];
}
希望有所帮助;祝你好运!