我正在特灵做一个动态的.env加载器和验证器。我使用envalid包,然后使用一个自定义函数,根据参数输入加载环境变量。
我有一个属性为requiredEnvs = [{ name: 'DATABASE_URL', type: str() }]
的类,然后我调用我的loadEnv函数const env = loadEnv(requiredEnvs)
。现在我应该能够访问env.DATABASE_URL
上的DATABASE_URL,并且还具有智能感知。
这是我的loadEnv
函数
const loadEnv = (envRequirements: EnvironmentVariable[])=> {
const obj = envRequirements.reduce((result, curr) => {
result[curr.name] = curr.type
return result;
}, {})
const env = cleanEnv(process.env, obj)
return env
}
然而,在loadEnv
函数中,我得到了一个错误,说“Element隐式地具有'any'类型,因为'any'类型的表达式不能用于索引类型'{}'”,我认为这是我的问题的主要来源。
我已经尝试了设置curr.name
作为这么多类型,但我没有想法。我想我必须使用typescript动态打字功能,但我还没有那么有经验,所以我真的希望得到一些帮助,谢谢。
以下是复制问题的repo:https://github.com/davidprokopec/typescript-loadEnvProblem
这里应该有一个playground就绪
1条答案
按热度按时间hivapdat1#
Array.prototype.reduce()
有一个泛型签名。当你没有为类型参数提供任何参数时,它会从最后一个initialValue
参数推断出你试图创建的对象的类型,当前的参数是{}
。由于从值
{}
推断类型得到{}
的类型,这是“一个从来没有任何键或值的对象”,typescript会产生错误,因为你试图将值分配给不应该存在的键。问题的解决方案是为reduce提供适当的泛型类型参数。
我在这里选择了
Record<string, string>
,因为我不知道你想给这个值赋什么类型。