【问题标题】:"Type argument cannot be inferred" in TypeScript class using generics在使用泛型的 TypeScript 类中“无法推断类型参数”
【发布时间】:2021-09-20 18:39:39
【问题描述】:

我在 TypeScript 的泛型类中创建了一个 BehaviorSubject,如下所示:

import { BehaviorSubject } from 'rxjs/BehaviorSubject';

interface Bar {
  a: any;
}

class Foo<T extends Bar> {
  subject = new BehaviorSubject<T[]>([]);
}

这里,subject 旨在发出 T 的数组。但是,(WebStorm)编译器抱怨 [] 数组传递给 BehaviorSubject 构造函数,说:

Type argument cannot be inferred by usage

即使我尝试像这样转换数组,我也会得到相同的结果:

subject = new BehaviorSubject<T[]>([] as T[]); // "Type argument cannot be inferred by usage"

可能的线索是,如果类型 T 没有扩展任何其他类型,则没有编译器投诉:

class Foo<T> {
  subject = new BehaviorSubject<T[]>([]); // no warning here
}

在运行时一切似乎都按预期运行,但我很好奇为什么会遇到此错误。

【问题讨论】:

  • 您的代码在这里编译得很好,既使用命令行 TypeScript 编译器(在 Angular-CLI 项目中),也使用 IntelliJ(WebStorm + 一堆与 Java 相关的东西)。 TypeScript 的版本是 2.5.3。它可以从 WebStorm 编译吗?您是否已将其配置为使用与您在命令行上使用的相同的 TypeScript 编译器?
  • 我们习惯了 WebStorm(IntelliJ 终极版),只是有时没有得到线索,而且我们的代码库包含很多这样的“错误”。有时它是“可修复的”,但有时它不值得。
  • @JBNizet 我也能够毫无问题地编译(通过ng build - 这是一个 Angular 项目)。看来此错误仅由 WebStorm (2017.3.5) 报告。它声称使用的是 TypeScript 2.6.2。
  • 您应该将其配置为使用位于项目的 node_modules 中的 TypeScript 版本。这样,IDE 将显示与命令行编译器相同的错误。
  • @JBNizet 感谢您的建议。 WebStorm 已配置(语言和框架> TypeScript)使用我的 package.json 中安装在 node_modules 中的typescript 模块,我认为它与 CLI 将使用的模块相同?我还禁用了 tslint 以确保这不是原因。 WebStorm 项目配置对我来说有点不透明,也许有另一个设置隐藏在某处使用不同的后台编译器。

标签: typescript generics rxjs


【解决方案1】:

这个问题似乎已通过更新一个或多个组件得到解决,因为我在 IDE 中不再看到任何错误。继续前进,没什么可看的!

  • WebStorm 2019.3.4
  • rxjs@6.6.3
  • typescript@4.0.3

【讨论】:

    【解决方案2】:

    另一种解决方法:打开 Settings -> Languages & Frameworks -> Typescript 并确保 Node interpreter 值指向正确的 Node 安装。见https://youtrack.jetbrains.com/issue/IDEA-278561

    【讨论】:

      猜你喜欢
      • 2016-12-05
      • 2020-03-11
      • 1970-01-01
      • 2019-09-17
      • 2016-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多