首页 > 解决方案 > 使用通用键和预定义的键声明 typescript 类型

问题描述

我的对象有这个结构(上游,不能改变):

{
  "@metadata": {
    "authors": ["name1", "name2"],
    "locale": "en",
  },
  "key1": "foo",
  "key2": "bar",
  ...
}

所有都keyN必须是字符串,并且密钥本身可以是任意的。可选@metadata块定义明确。我如何在 TypeScript 中声明这样的结构?

我试过这个,但它似乎没有用。谢谢!

type Messages = {
  readonly ['@metadata']?: any
  readonly [key: string]: string
};

标签: typescripttypescript-typings

解决方案


您可以通过交集部分地做到这一点,这意味着您可以对现有数据进行如下建模:

const foo={
  "@metadata": {
    "authors": ["name1", "name2"],
    "locale": "en",
  },
  "key1": "foo",
  "key2": "bar",
} as unknown as Messages

type Messages = {
  [key: string]: string } & {
  '@metadata': any
}

let x = foo["@metadata"]
let y = foo.key1

但是,如您所见,我必须断言类型,因为 TS 不允许您创建这种形式的对象。这是此处描述的已知限制。


推荐阅读