【问题标题】:TypeScript nested object interface with known subset of keys具有已知键子集的 TypeScript 嵌套对象接口
【发布时间】:2021-10-21 15:59:57
【问题描述】:

我有一个这样创建的 JavaScript 对象。

const meta = {
  baz: null
}

const response = {
  foo: 1,
  bar: {
    foo: 2,
    buzz: {
      foo: 3,
      ...meta
    },
    ...meta
  },
  ...meta,
  qux: ‘qux’
}

响应对象是一个可以包含任何键的普通对象。我们知道键的类型foobazqux。我们不知道其他键名,但是当它们确实存在时,它们是具有已知接口的对象。其实response对象就是这个接口的一个实例。

如何创建表达这种逻辑的 TypeScript 界面?我希望编译器允许定义这样的对象:

const foo: MyInterface = {
  foo: 1,
  dynamicKey: {
    baz: null
  }
}

【问题讨论】:

  • 索引签名不起作用吗? (考虑用[key: string]: KnownInterface替换dynamicKey
  • 如果您对this limitation 没问题,索引签名可能会起作用。否则,我认为您想要this question,其中答案被翻译为“MyInterface 的字典,但具有一组其他类型的已知键”。当我得到它时,我可以做到。
  • 感谢@jcalz,诀窍是像您在示例中向我展示的那样扩展索引签名界面。

标签: javascript typescript types interface


【解决方案1】:

如果您对this limitation 没问题,索引签名可能会起作用。

这适用于我的用例。诀窍是用所有值扩展索引签名接口。正如所指出的那样,这有一个限制,但它比没有任何类型检查或自动完成要好得多。我的界面现在看起来像这样。

interface MyInterface extends KnownInterface {
  [key: string]: MyInterface | KnownInterface[keyof KnownInterface];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 2016-11-10
    • 2017-07-02
    • 2021-01-18
    相关资源
    最近更新 更多