使用通用键和预定义键声明打字稿类型

时间:2020-09-19 20:24:57

标签: typescript typescript-typings

我的对象具有这种结构(上游,无法更改):

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

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

我尝试了这个,但是似乎没有用。谢谢!

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

2 个答案:

答案 0 :(得分:1)

您可以使用交点部分完成此操作,这意味着您可以按以下方式对现有数据进行建模:

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不允许您创建这种形式的对象。这是here中描述的已知限制。

答案 1 :(得分:0)

您可以像这样将通用变量设置为字符串

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

const foo = () => {
  const data: Messages<string> = {
    key: 'stuff',
  };
};