【问题标题】:Typing a record of a known type键入已知类型的记录
【发布时间】:2019-03-22 08:36:34
【问题描述】:

我有如下界面:

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

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

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

我曾希望,这会给我键入的哈希属性,并确保也键入“之前”和“之后”值。遗憾的是,这会导致在[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" | “价值”'。

事情变得一团糟,我有点卡住了。有人可以帮忙吗?

【问题讨论】:

标签: typescript


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-01-18
    • 2022-08-10
    • 1970-01-01
    • 2020-09-21
    • 2015-09-19
    • 1970-01-01
    • 2013-10-12
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多