TypeScript中的递归索引签名
我正在尝试向嵌套对象添加索引签名类型,以便通过计算值访问它的一些属性 例如,给定此对象:TypeScript中的递归索引签名,typescript,typescript-typings,Typescript,Typescript Typings,我正在尝试向嵌套对象添加索引签名类型,以便通过计算值访问它的一些属性 例如,给定此对象: 导出常量英语={ 主页:{ 标题:“标题”, 字符列表:“字符列表”, 招式:"招式",, 标题:“主页”, 搜索:“搜索”, }, 人物:{ 详情:{ 关于:{ 标题:"关于",, 信息:“信息”, 全名:“全名”, 状态:“状态”, 性别:'性别', }, 来源:{ 标题:“起源”, 来源:'来源', 当前位置:“当前位置”, }, }, }, } 我希望访问其属性,如下所示: const key='
导出常量英语={
主页:{
标题:“标题”,
字符列表:“字符列表”,
招式:"招式",,
标题:“主页”,
搜索:“搜索”,
},
人物:{
详情:{
关于:{
标题:"关于",,
信息:“信息”,
全名:“全名”,
状态:“状态”,
性别:'性别',
},
来源:{
标题:“起源”,
来源:'来源',
当前位置:“当前位置”,
},
},
},
}
我希望访问其属性,如下所示:
const key='moves';
英语.主页[键]
但我不能把它弄对。到目前为止,我已经能够键入第一层
导出类型转换={
[key:string]:typeof english[keyof typeof english]
}
我认为这需要某种递归方法,但我不知道如何实现它您可以使用简单的javascript函数reduce
const key='home.moves';
const value=key.split('.').reduce((obj,prop)=>obj[prop],英语);
好的,我想我知道我们需要做什么。问题是对象允许键在类型string
中具有每个值,但一旦定义了类型,就需要使用string
的子集。因此,TypeScript抛出了一个错误,您不能只访问每个字符串,而只能访问作为有效键的字符串(例如,移动
,标题
,等等)
因此,在某个时间点,您必须确保要访问的密钥有效
这里有一些可能性
a)包含常量上下文的字符串文字
你分配的那一刻
const key = 'moves'
键
不是类型字符串
,而是类型“移动”
,一种非常特定的值类型(或文字类型)和字符串的子类型。这种访问方式应该有效
const key='moves'
english.home[key]//首先,谢谢!我想这也行得通,还有(english.home as any)[key]
,但我希望整个对象树都有id签名类型,以避免这些解决方法对象形状的动态部分是什么?对象结构在不同的翻译中是否相同?只要key
是常量,访问english.home[key]
就应该可以工作。它在运行时确实可以工作,但我会收到类型脚本错误,指出“string”不是我对象的索引。不同的语言应该有相同的结构,是的。对象在形状和内容上是恒定的,但在某些情况下,我需要使用计算键,而不是直接访问元素