【发布时间】: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