Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TypeScript中的递归索引签名_Typescript_Typescript Typings - Fatal编程技术网

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”不是我对象的索引。不同的语言应该有相同的结构,是的。对象在形状和内容上是恒定的,但在某些情况下,我需要使用计算键,而不是直接访问元素