【问题标题】:Karma or TypeScript compiler told me Property 'padStart' does not exist on type 'String'Karma 或 TypeScript 编译器告诉我“字符串”类型上不存在属性“padStart”
【发布时间】:2019-08-17 11:55:01
【问题描述】:

我有一个 Angular 7 项目,其中 lib=es2015 和 target=es2015,Angular-CLI 编译和应用程序运行都非常好。但是,当使用ng test 运行单元测试时,Karma 或 TypeScript 编译器告诉我“字符串”类型上不存在属性“padStart”

27 03 2019 10:40:57.424:INFO [karma-server]: Karma v4.0.1 server started at http://0.0.0.0:9876/
27 03 2019 10:40:57.424:INFO [launcher]: Launching browsers Chrome with concurrency unlimited
27 03 2019 10:40:57.429:INFO [launcher]: Starting browser Chrome
ERROR in node_modules/@azure/storage-blob/lib/utils/utils.common.ts(300,24): error TS2339: Property 'padStart' does not exist on type 'String'.
node_modules/@azure/storage-blob/lib/utils/utils.common.ts(301,26): error TS2339: Property 'padStart' does not exist on type 'string'.

在检查错误消息中指示的违规代码时:

export function padStart(
  currentString: string,
  targetLength: number,
  padString: string = " "
): string {
  if (String.prototype.padStart) {
    return currentString.padStart(targetLength, padString);
  }
...

我发现最后两行代码对我来说看起来非常好,因为我知道 padStart 是在 es2017 中定义的,所以 lib 的程序员已经制作了这些。如果在tsconfig.json中我有lib=es2017和target=es2015,那么编译ng test就可以了。

我喜欢找出问题的原因,怀疑是:Type Script 编译器、Karma、Angular 编译器或有问题的代码。你觉得是哪一种?

【问题讨论】:

  • 我相信 karma 会使用不同的 tsconfig 开箱即用...你可以尝试更新 src/app/tsconfig.test.json 吗?
  • 运行 ng build 时是否显示该错误?
  • @Explosion Pills,虽然 Angular.json 确实指向未定义 lib 和目标的 tsconfig.test.json,但我相信 karma 也使用显然由应用程序和规范共享的 tsconfig.json,因为为 lib 和 target 更改 tsconfig.json 确实解决了这个问题。但是,我认为在语义上所有版本的 JavaScript 引擎中的违规代码都很好。你认为是吗?我只是想找出问题的原因,怀疑是:TS编译器,Karma,Angular编译器,或者有问题的代码。你觉得是哪一种?

标签: angular typescript unit-testing karma-runner


【解决方案1】:

如果在tsconfig.json中我有lib=es2017和target=es2015,那么编译ng test就可以了

这是正确的解决方法。 padStart 仅与 ES2017 一起出现:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart

【讨论】:

  • 我知道这一点。但是,有问题的代码在所有版本的 JavaScript 中看起来都很好。你认为是吗?我喜欢找出问题的原因,怀疑是:Type Script 编译器、Karma、Angular 编译器或有问题的代码。你觉得是哪一个?因为用ng build --base-href --aot 编译没有问题。我的猜测是 AOT 编译通过检查检测代码更智能,而 Karma 使用的 TS 编译器并不那么智能。但是,我不确定。
  • ` 但是,有问题的代码在所有版本的 JavaScript 中看起来都很好` 不。在 ES2017 之前的任何东西都不好,例如ES2016。也就是说,它可以是 polyfiled ?
猜你喜欢
  • 2019-02-16
  • 2021-03-01
  • 2021-12-18
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 2019-08-27
  • 2022-11-24
  • 2019-08-25
相关资源
最近更新 更多