输入信封
Typescript 的强型, 0 依赖性环境变量解析器 !
开始吧
npm install --save @amccarthy1/typed-env # npm
yarn add @amccarthy1/typed-env # yarn
import { TypedEnv, EnumVar } from '@amccarthy1/typed-env'
const env = TypedEnv({
ENVIRONMENT: EnumVar({ options: ['dev', 'staging', 'prod'] }),
})
doWhateverToRunApp(env.ENVIRONMENT) // env.ENVIRONMENT is of type 'dev' | 'staging' | 'prod'
为什么这样有用
许多服务使用环境变量进行运行时配置, 任何来自当前 环境或记录动词, 给像 API 密钥和秘密的东西。 但很多次,这些 环境变量未经验证,在需要时天真地从字符串中解析出.
此库旨在允许您以更安全的方式定义环境变量 。 拿着这个 示例:
const environment = process.env.ENVIRONMENT
const makePayment = (amount: bigint) => {
if (environment === 'prod') {
makeRealPayment(amount)
} else {
makeMockPayment(amount)
}
}
如果您配置了您的服务器 ENVIRONMENT=production 改为 ENVIRONMENT=prod? 吗?
突然间,所有的用户都得到了免费产品 因为你在做模拟支付而不是
真实的!
如果你用TypedEnv代替, 你会得到这个
const env = TypedEnv({
ENVIRONMENT: EnumVar({ options: ['dev', 'staging', 'production'] }),
})
const makePayment = (amount: bigint) => {
if (env.ENVIRONMENT === 'prod') {
// TypeError!
// `This condition will always return 'false' since
// the types '"dev" | "staging" | "production"' and
// '"prod"' have no overlap.`
return makeRealPayment(amount)
} else {
return makeFakePayment(amount)
}
}
支持哪些类型?
目前, 字符串、 enum、 整数、 布尔和日期都被支持, 尽管您可以定义自己的自定义类型
使用 Declaration<T> 类型
export type Declaration<T> = {
variable?: string // The name of the environment variable; defaults to match the key if not specified
parser: Parser<T> // A function (value: string) => T
}
可选变量呢?
TypedEnv 主要是为需要的变量而构建的,但确实支持使用一个 defaultValue 属性.
如果您不想使用明确的默认, 您可以使用 optional() 提供了自动包装
输入默认值为 null 转换 a Declaration<T> 改为 Declaration<T|null>
const env = TypedEnv({
required: BoolVar({ defaultValue: false }),
optional: optional(BoolVar()),
})
// This schema yields the following type object
const env: {
required: boolean
optional: boolean | null
}
一般倾向于使用 defaultValue 超过 optional 包装,但是 optional 可能有益于移徙
已有的将 env vars 视为可选的编码库.