typescript - 使用通用键和预定义的键声明 typescript 类型
问题描述
我的对象有这个结构(上游,不能改变):
{
"@metadata": {
"authors": ["name1", "name2"],
"locale": "en",
},
"key1": "foo",
"key2": "bar",
...
}
所有都keyN
必须是字符串,并且密钥本身可以是任意的。可选@metadata
块定义明确。我如何在 TypeScript 中声明这样的结构?
我试过这个,但它似乎没有用。谢谢!
type Messages = {
readonly ['@metadata']?: any
readonly [key: string]: string
};
解决方案
您可以通过交集部分地做到这一点,这意味着您可以对现有数据进行如下建模:
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 不允许您创建这种形式的对象。这是此处描述的已知限制。
推荐阅读
- docusignapi - DocuSign API 通过 OneLogin
- permissions - 如何在导航器中请求访问我的站点的音频/声音(不是麦克风,而是声音权限)权限
- python - 跳过 python 文本文件中的注释并插入列标题
- android - 是否有一个库可以在一个具有不同格式的 TextView 中显示长文本?
- c++ - 通过for循环获取文件的行数
- python - 在一组“二进制字符串”中计算一个(Python)
- c# - 当单元格在 EPPlus 中具有多种样式时,公式单元格正在提取 xml 样式表值
- android - 通过清单注册的广播接收器是否会在应用关闭时自动取消注册?
- ios - 从 Facebook 点击的 Ionic Cordova 分支深层链接返回 `+clicked_branch_link: false`
- c++ - 包含子元素的元素的数组?