typescript - Typescript - 始终以字符串或数字结尾的通用对象类型
问题描述
打字稿中是否有一种方法可以制作一个可以有很多层次但仍然始终以字符串或数字属性值结尾的通用对象。
interface GenericObject {
[key: string]: string | number | GenericObject | GenericObject[];
}
const object: GenericObject = {
test: 'test',
testNum: 2,
test2: {
test: 'test'
},
test3: [
{
test: 'test'
}
]
}
这样的东西在创建对象时可以正常工作,但是在尝试访问属性时会引发错误。
object.test2.test;
object.test3[0].test;
类型“字符串”上不存在属性“测试”| 号码 | 通用对象 | 通用对象[]'
有没有办法让这个工作,所以你可以无限深的层次,但总是以字符串或数字结尾?
解决方案
我不是 TS 专家(还)。但是,我认为你的定义没有错。
问题在于,在 TS 中,您只能访问保证在联合类型的所有组成部分中的成员。
因此,您收到此类错误是有道理的。类型 number、string 和一些 GenericObject 接口之间没有足够的重叠。TS 不知道 test2 变量是原始变量还是带有一些键的对象。
告诉 TS test2 或 test3 道具是什么(在访问位置)的一种方法是通过as重新映射密钥:
(object.test2 as GenericObject).test;
并保持object: GenericObject
原样。只是我的两分钱。我很高兴看到其他人建议作为您问题的解决方案(无限深的对象)。
推荐阅读
- json - 用于 Elasticsearch 的 logstash 过滤器插件是什么?
- sql - SQL 按详细信息和月份聚合事务
- google-data-studio - 模仿 Matplotlib 的“缩放到矩形”功能
- python - Python SSL 错误握手
- c# - C# asp.net 4 尝试检查会话是否为空,并出现错误
- c# - 如何在 C# 中使用 Selenium 从 Chrome 下载 PDF
- ssis - SSIS - 当目标是钱时,OLE DB 连接管理器正在截断数值
- vuejs2 - Vuetify 的 1.3 v-autocomplete computedMinWidth 问题
- android - 如何从互联网下载文件并将其保存到 Flutter/dart 的内部存储(android)?
- javascript - 如何使用过滤器或其他 JS 方法(按属性)显示特定的 JSON 数据