如何使用TypeScript中的已知类型动态索引记录?

如何使用TypeScript中的已知类型动态索引记录?,typescript,typescript-typings,Typescript,Typescript Typings,我正在尝试使用一个可能也可以键入的字符串动态索引一个已知类型的记录,下面是所有相关代码,包括reduce中显示的错误(acc[val]),我在理解错误时遇到困难,因此我不知道如何修复它 接口命令spingdescription{ 类型:字符串; 道具:永不; } 接口定位图{ “commands.ping.description”:CommandsPingDescription; } 从“./locale/base.json”导入base; 从“./locale/en.json”导入en; 类

我正在尝试使用一个可能也可以键入的字符串动态索引一个已知类型的记录,下面是所有相关代码,包括reduce中显示的错误(
acc[val]
),我在理解错误时遇到困难,因此我不知道如何修复它

接口命令spingdescription{
类型:字符串;
道具:永不;
}
接口定位图{
“commands.ping.description”:CommandsPingDescription;
}
从“./locale/base.json”导入base;
从“./locale/en.json”导入en;
类型语言=语言类型的键;
常量语言:记录={en};
导出常量setLanguage=(lang:T)=>{
返回<
K扩展了定位图的关键部分,
V扩展本地化地图[K][“道具”]
>(
关键:K,
…占位符:V[]
) => {
让翻译=关键
.拆分(“.”)
.reduce((acc,val)=>acc[val],语言[lang]);
(参数)acc:记录[T]
元素隐式具有“any”类型,因为类型“string”的表达式不能用于索引类型“{commands:{ping:{description:string;};};};}”。
在类型{commands:{ping:{description:string;};};}上未找到具有“string”类型参数的索引签名。

操场链接:

您代码的核心部分似乎在这里:

const key=“commands.ping.description”;
常数en={
命令:{
平:{
说明:“;
}
}
}
让翻译=关键
.拆分(“.”)
.reduce((acc,val)=>acc[val],en);
您希望TypeScript做的是找出
acc[val]
where的类型
val
key
的子字符串。这不会发生;它远远超出了字符串文本类型的限制,这是有充分理由的

我建议您做的是将您的类型放宽为以下类型:

const key=“commands.ping.description”;
接口递归记录{
[key:string]:T |递归记录;
}
常量en:RecursiveRecord={
命令:{
平:{
描述:“你好”;
}
}
}
//查看key.split(“.”)中的属性
//并将末尾的字符串指定给translation
让记录=en;
让翻译:string=“”;
for(键的常量substr.split(“.”){
const oneleveldeepher=记录[substr];
如果(oneLevelDeeper的类型==“字符串”){
翻译=一级
打破
}否则{
记录=1级;
}
}
console.log(翻译);/“你好”

考虑修改此代码以构成一个可以放入独立IDE中的脚本,以演示您所看到的内容。例如,您可以提供
base
en
键入,或者通过简化代码来消除对它们的依赖。祝您好运!base是json,其结构如图所示在错误中,记录只接受类型为base的json,这意味着en与base相同。我已启用resolveJsonModules。如果我无法快速将其放入独立IDE并复制,则我获得它的机会较小。也许其他人会愿意回答而不复制,或者尝试更有效地复制它t、 但是如果你给出一个容易理解的答案,你得到一个好答案的机会就会增加。祝你好运!我已经添加了一个到操场的链接
(parameter) acc: Record<"en", {
    commands: {
        ping: {
            description: string;
        };
    };
}>[T]
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ commands: { ping: { description: string; }; }; }'.
  No index signature with a parameter of type 'string' was found on type '{ commands: { ping: { description: string; }; }; }'.