typescript 严格配置导致元素隐式具有“any”类型,因为索引表达式不是“number”类型

kb5ga3dv  于 2023-03-19  发布在  TypeScript
关注(0)|答案(1)|浏览(309)

我试图从Windows读取一些环境变量。在我的env.js中,我设置了一个如下变量:

(function(window) {
  window["env"] = window["env"] || {};

  window["env"]["apiURL"] = "https://localhost:44388";
})(this);

然后我想在这样的环境文件中读取它(env.dev.ts):

const apiUrl= window['env']['apiURL'];

export const environment = {
  url: {
    apiBaseUrl: `${apiUrl}`,
  },
};

这会导致environment.dev.ts文件中的['env']下出现一条红线,说明Element implicitly has an 'any' type because index expression is not of type 'number'。一个解决方法是在tsconfig.json中设置strict: false,但我希望保留strict: true。也可以隐藏这类警告,但这似乎很不靠谱。有没有其他方法可以读取apiURL变量?

ahy6op9u

ahy6op9u1#

这看起来像是declaration merging的一个任务,它允许你在已有的声明中“添加”一些东西,因为你期望window有一个{apiURL: string}类型的env属性,并且window是全局的Window接口类型,你可以通过global扩展来合并这个属性:

declare global {
  interface Window {
    env: {
      apiURL: string
    }
  }
}

在此之后,事情应该按预期工作:

const apiUrl = window['env']['apiURL']; // okay
// const apiUrl: string

export const environment = {
  url: {
    apiBaseUrl: `${apiUrl}`,
  },
};

Playground代码链接

相关问题