NodeJS 如何创建类型安全的环境变量加载器

cetgtptt  于 2023-04-05  发布在  Node.js
关注(0)|答案(1)|浏览(121)

我正在特灵做一个动态的.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就绪

hivapdat

hivapdat1#

Array.prototype.reduce()有一个泛型签名。当你没有为类型参数提供任何参数时,它会从最后一个initialValue参数推断出你试图创建的对象的类型,当前的参数是{}
由于从值{}推断类型得到{}的类型,这是“一个从来没有任何键或值的对象”,typescript会产生错误,因为你试图将值分配给不应该存在的键。
问题的解决方案是为reduce提供适当的泛型类型参数。

const obj = envRequirements.reduce<Record<string, string>>((result, curr) => {
  result[curr.name] = curr.type;
  return result;
}, {});

我在这里选择了Record<string, string>,因为我不知道你想给这个值赋什么类型。

相关问题