Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 以编程方式声明my env中环境键的typescript类型_Javascript_Node.js_Typescript_Environment Variables - Fatal编程技术网

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。。为什么这样更好?