Typescript:undefined不可赋值为返回值,而undefined不能返回

wyyhbhjk  于 2022-12-05  发布在  TypeScript
关注(0)|答案(2)|浏览(147)

我有下面的一段代码,它通过dotenv拉环境变量,如果它不存在,可以替换它,如果defaultValue被传递,或者如果它们都不包含值,就会抛出错误。这会造成执行崩溃或返回有效值的情况。

const getEnvironmentVariable = (
  variable: string,
  defaultValue?: string|number,
): string | number => {
  if((process.env[variable] === undefined) && defaultValue === undefined){
    // eslint-disable-next-line max-len
    throw new Error(`Mandatory environment variable ${variable} was not set.`)  
  }
  
  if(
    process.env[variable] === undefined 
    && defaultValue !== undefined
  ) {
    // eslint-disable-next-line no-console, max-len
    console.info(`Environment variable ${variable} was not set. Using default: ${defaultValue}`)
  }
  return process.env[variable] ?? defaultValue
}

但是我在返回时得到以下错误,即使它永远不会发生,也会返回undefined。
类型'字符串|undefined "不能赋值给类型“字符串|类型'undefined'不能赋给类型'string|编号“。

0sgqnhkj

0sgqnhkj1#

typescript 不理解的概念:如果此变量未定义,则意味着另一个变量未定义。
对于Typescript,这只是意味着这两个变量都可以不定义。
您可能会遇到的另一个问题是,即使您在上一行签入,process.env[variable]也总是返回string | undefined。因此,您应该将其存储在const中。下面是一个应该有效的示例:

const getEnvironmentVariable = (
  variable: string,
  defaultValue?: string | number,
): string | number => {
  const environmentVariable = process.env[variable]
  
  if (environmentVariable === undefined) {
    if (defaultValue === undefined) {
      throw new Error(
        `Mandatory environment variable ${variable} was not set.`,
      );
    }
    console.info(
      `Environment variable ${variable} was not set. Using default: ${defaultValue}`
    );
    return defaultValue;
  }
  return environmentVariable;
};
8iwquhpp

8iwquhpp2#

在第一个if之后,defaultValue仍然是string | number | undefined,因为and
由于process.env[variable] === undefined可能为假,因此不检查第二个操作数。
对于第二个if也是如此,为了检查defaultValue === undefined,必须拆分if

const getEnvironmentVariable = (
  variable: string,
  defaultValue?: string|number,
): string | number => {
  if(process.env[variable] === undefined) {

    if(defaultValue === undefined) {
      // eslint-disable-next-line max-len
      throw new Error(`Mandatory environment variable ${variable} was not set.`)  
    }

    if(defaultValue) {
      console.info(`Environment variable ${variable} was not set. Using default: ${defaultValue}`)
      return defaultValue;
    }
  }
  
  return process.env[variable];
}

相关问题