Javascript 以编程方式声明my env中环境键的typescript类型
假设我得到了这个Javascript 以编程方式声明my env中环境键的typescript类型,javascript,node.js,typescript,environment-variables,Javascript,Node.js,Typescript,Environment Variables,假设我得到了这个.env.local文件: SOME_VAR="this is very secret" SOME_OTHER_VAR="this is not so secret, but needs to be different during tests" 是否有任何方法可以通过编程方式获取typescript以生成如下类型: type TEnv = 'SOME_VAR' | 'SOME_OTHER_VAR' export default fun
.env.local
文件:
SOME_VAR="this is very secret"
SOME_OTHER_VAR="this is not so secret, but needs to be different during tests"
是否有任何方法可以通过编程方式获取typescript以生成如下类型:
type TEnv = 'SOME_VAR' | 'SOME_OTHER_VAR'
export default function env(key: TEnvKey): string {
try {
// have to try catch because of Cypress reference error
return Cypress.env(key)
} catch {
switch (key) {
case 'SOME_VAR':
return process.env.SOME_VAR
case 'SOME_OTHER_VAR':
return process.env.SOME_OTHER_VAR
default:
return undefined
}
}
}
我的用例是这样的
export default function env(key: TEnv): string {
return process.env[key] || Cypress.env(key)
}
import dotenv from 'dotenv'
class DynamicArray<T> {
add(value: T): Array<T> {
let collection = new Array<T>()
collection.push(value)
return collection
}
}
const TEnvKey = new DynamicArray<string>()
const envFile = dotenv.config({ path: '.env.local' }).parsed
Object.keys(envFile).forEach((key) => TEnvKey.add(key))
export default function env(variable: TEnvKey): string {
return process.env[variable] || Cypress.env(variable)
}
我想我可能会触发一个脚本,通过dotenv
(或bash)读取密钥,然后用它们编写一个types.d.ts文件。。。但我只是想知道是否已经有一种TS方法可以做到这一点
我最近的尝试是这样的
export default function env(key: TEnv): string {
return process.env[key] || Cypress.env(key)
}
import dotenv from 'dotenv'
class DynamicArray<T> {
add(value: T): Array<T> {
let collection = new Array<T>()
collection.push(value)
return collection
}
}
const TEnvKey = new DynamicArray<string>()
const envFile = dotenv.config({ path: '.env.local' }).parsed
Object.keys(envFile).forEach((key) => TEnvKey.add(key))
export default function env(variable: TEnvKey): string {
return process.env[variable] || Cypress.env(variable)
}
我做了一件有用的东西:) mjs打字机 package.json 然后我只需在vscode中执行
纱线类型
(和>重新加载窗口
)
不要经常更改我的变量,这样就可以了
更新版本
模板:
utils/env.ts
导出默认函数env(key:TEnvKey):字符串{
试一试{
//由于Cypress引用错误,必须尝试捕获
返回Cypress.env(键);
}抓住{
开关(钥匙){
//自动生成案例的开始--不要删除或编辑此注释
//此部件将被更换
//自动生成的案例结束--不要删除或编辑此注释
违约:
返回未定义;
}
}
}
//自动生成类型的开始--不要删除或编辑此注释
//这将被替换
环境类型写入器
从'dotenv'导入{config}
从“fs”导入{writeFileSync,readFileSync}
const envLocal=config({path:'.env.local'})。已解析//注意:必须从项目根目录执行脚本
const typeText=`type TEnvKey=\n |“${Object.keys(envLocal.join(“\n |“)}”`
const casesText=Object.keys(envLocal).reduce((acc,key)=>{
acc+=`case'${key}':\n`
acc+=`返回进程.env.${key}\n`
返回acc
}, '')
常量文件路径='utils/env.ts'
让text=readFileSync(文件路径,{encoding:'utf8'})
log(`reading${filePath}`)
如果(!text)抛出“未读”
常量casesStartLineMarker=
“//自动生成案例的开始--不要删除或编辑此注释\n”
常量casesEndLineMarker=
“//自动生成的案例结束--不要删除或编辑此注释\n”
文本=`${
text.split(casesStartLineMarker)[0]
}${casesStartLineMarker}${casesText}${casesEndLineMarker}${
text.split(casesStartLineMarker)[1]。split(CaseSSendLineMarker)[1]
}`
const typesLineMarker='//自动生成类型的开始--不要删除或编辑此注释\n
const[untouchedCode,_types]=text.split(typesLineMarker)
const updateText=`${untouchedCode}${typesLineMarker}${typeText}`
writeFileSync(文件路径,UpdateText,'utf8')
为什么使用键入TEnv
而不使用enum EEnv
?没有太多使用enum。。为什么这样更好?