我的对象具有这种结构(上游,无法更改):
{
"@metadata": {
"authors": ["name1", "name2"],
"locale": "en",
},
"key1": "foo",
"key2": "bar",
...
}
所有keyN
必须是字符串,并且密钥本身可以是任意的。可选的@metadata
块定义明确。我该如何在TypeScript中声明类似的结构?
我尝试了这个,但是似乎没有用。谢谢!
type Messages = {
readonly ['@metadata']?: any
readonly [key: string]: string
};
答案 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',
};
};