Typescript 没有带类型为';的参数的索引签名;字符串';在类型';字符串| number | EnvType';

Typescript 没有带类型为';的参数的索引签名;字符串';在类型';字符串| number | EnvType';,typescript,Typescript,如何在config[curr][targetEnv]中消除此错误 interface EnvType { dev: string; staging: string; production: string; } type Config = { [key: string]: number | string | EnvType; }; const config: Config = { networkTimeout: 10000, apiHost: { dev: 'h

如何在
config[curr][targetEnv]
中消除此错误

interface EnvType {
  dev: string;
  staging: string;
  production: string;
}

type Config = {
  [key: string]: number | string | EnvType;
};

const config: Config = {
  networkTimeout: 10000,
  apiHost: {
    dev: 'http://localhost:8080',
    staging: 'https://staging.example.com',
    production: 'https://example.com',
  },
};

const targetEnv = process.env.TARGET_ENV || 'dev';

const mappedConfig = Object.keys(config).reduce((acc, curr) => {
  const currValue = config[curr];

  // string or number or boolean; just return the value
  if (typeof currValue !== 'object') {
    return { ...acc, [curr]: currValue };
  }

  // is object; retrieve value by env
  if (typeof currValue === 'object') {
    return { ...acc, [curr]: config[curr][targetEnv] }; // error on this line
  }

  // do nothing
  return { ...acc };
}, {});

export default mappedConfig;

您正在尝试使用字符串键查找值。它适用于
config[curr]
,因为您的配置类型中有一行:

[键:字符串]:数字|字符串|类型

但是,您尝试在
EnvType
的对象中执行相同的操作

您需要对该接口执行相同的操作,如下所示:

interface EnvType {
  [key: string]: string;
  dev: string;
  staging: string;
  production: string;
}

在这之后,问题很可能会变成配置可以是一个
数字
或一个
字符串
,两者都不能像这样被索引。

首先你必须约束你的
进程.env.TARGET_env
,以确保值只能是
开发
暂存
生产

const targetEnv=(process.env.TARGET_env作为EnvType的键)​|| '德夫;
其次,将
config[curr]强制转换为
typeof currValue==='object'
条件内的EnvType
。这样,您就可以告诉TypeScript,如果满足
条件,则确保
config[curr]
返回正确的
EnvType
,而不是
string
number

//是对象;通过env检索值
如果(类型currValue==='object'){
返回{…acc[curr]:(将[curr]配置为EnvType)[targetEnv]};//此行出错
}
例如:

接口类型{
dev:string;
暂存:字符串;
制作:细绳;
}
类型配置={
[键:字符串]:数字|字符串|类型;
};
常量配置:配置={
网络超时:10000,
apiHost:{
戴夫:是的http://localhost:8080',
登台:'https://staging.example.com',
制作:'https://example.com',
},
};
const targetEnv=process.env.TARGET_env作为EnvType | | |“dev”;//添加了`作为关键字`
const mappedConfig=Object.keys(config).reduce((acc,curr)=>{
const currValue=config[curr];
//字符串、数字或布尔值;只返回值
if(类型currValue!=“对象”){
返回{…acc[curr]:currValue};
}
//是对象;通过环境检索值
如果(类型currValue==='object'){
返回{…acc[curr]:(将[curr]配置为EnvType)[targetEnv]};//添加为'as`
}
//无所事事
返回{…acc};
}, {});
导出默认mappedConfig;
感谢nenad的帮助=)投票赞成