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的帮助=)投票赞成