我们最近完成了我们的应用程序从Angular 14到Angular 16的升级.虽然大多数应用程序顺利过渡没有任何问题,但我们在构建过程中遇到了一些问题.构建过程完成时没有出现错误,但似乎没有正确注入环境.prod.ts文件中的正确值.

在我们的环境.prod.ts文件中,我们有一个应该由Azure DevOps注入的变量.此变量按以下方式将字符串替换为数字:

export const environment = {
  // ...other variables
  id: Number('#{idfromazure}#'),
};

然而,在我们密集的调试过程中,我们发现这个特定的变量抛出一个错误,表明它"不是一个数字".

我们已经浏览了Angular 版本15和16的ChangeLog,但除了这个:GitHub Pull Request #48720之外,还没有准确地找到任何相关的更改.

我们正在联系社区,询问是否有人在升级后遇到过类似的问题.目前,我们正在try 一种解决办法,在不公开ID的情况下将ID注入应用程序.

在这一点上,我们不确定这个问题是否与Typescript 、Angular 本身或完全其他东西有关.如有任何见解或建议,我们将不胜感激.

谢谢!

推荐答案

事实证明,在Angular 环境文件中处理数字和布尔值的方式正在影响结果.令人惊讶的是,代码中的一个小调整就解决了这个问题.

最初,以下方法没有像预期的那样工作:

export const environment = {
  // ...other variables
  id: Number('#{idfromazure}#'),
};

然而,经过一些实验后,我找到了一个有效的解决方案,尽管我没有明确的解释为什么它的行为不同:

const fixForNumbers = (s: string) => Number(s);

export const environment = {
  // ...other variables
  id: fixForNumbers('#{idfromazure}#'),
};

如上所述,通过将数字转换包装在单独的函数中,环境变量id被正确解析.值得注意的是,这个解决方案似乎解决了问题,尽管导致这种行为的根本原因并不是立竿见影的.

此修复可能是由于TypeScrip处理Azure DevOps环境变量转换的方式存在细微差异.但是,如果没有更深入地了解具体细节,此解决方案可以作为那些面临类似挑战的人的变通办法.

在此特定用例中,使用Azure DevOps中的实际环境变量值替换#{idFromazure}#.

Typescript相关问答推荐

node—redis:如何在redis timeSeries上查询argmin?

如何使类型只能有来自另一个类型的键,但键可以有一个新值,新键应该抛出一个错误

在NextJS中获得Spotify Oauth,但不工作'

泛型函数中输入参数类型的推断问题

类型脚本`Return;`vs`Return unfined;`

如何判断对象是否有重叠的叶子并产生有用的错误消息

错误TS2403:后续变量声明必须具有相同的类型.变量';CRYPTO';的类型必须是';CRYPATO';,但这里的类型是';CRYPATO';

从对象类型描述生成类型

在保留类型的同时进行深层键名转换

将具有Readonly数组属性的对象接口转换为数组

正交摄影机正在将渲染的场景切成两半

如何从MAT-FORM-FIELD-MAT-SELECT中移除焦点?

为什么TS2339;TS2339;TS2339:类型A上不存在属性a?

使用强类型元组实现[Symbol.iterator]的类型脚本?

如何在具有嵌套数组的接口中允许新属性

埃斯林特警告危险使用&as";

如何在由函数参数推断的记录类型中具有多个对象字段类型

我是否应该在 Next.js 中的服务器组件中获取秘密数据的所有函数中使用使用服务器?

如何确定剧作家中给定定位器的值?

如何判断路由或其嵌套路由是否处于活动状态?