【问题标题】:Why is code completion for subclasses not working in angular templates?为什么子类的代码完成在角度模板中不起作用?
【发布时间】:2021-06-10 06:24:42
【问题描述】:

例如,当我们的组件上有 2 个数组属性时:

  • array:一个普通的Array
  • anonymousArray Array 的子类
export class AppComponent {
  readonly array = new Array<{
    text: string;
    value: string;
  }>();

  readonly anonymousArray = new class extends Array<{
    text: string;
    value: string;
  }> {
    add(text: string, value: string) {
      this.push({
        text,
        value
      });
    }
  }();

  constructor() {
    this.array.push({
      text: "text1",
      value: "value1"
    });

    this.anonymousArray.add("text", "value");
  }
}

然后模板中的代码补全适用于普通数组:

但不适用于子类:

这是完整的Stackblitz example

IntelliJ 甚至会显示错误:

我首先想知道这怎么可能:即因为 Array.isArray(this.anonymousArray) 是 true,那么模板如何/为什么甚至会看到差异?
这可能是 Ivy 或 angular language service 中的错误吗?

【问题讨论】:

  • 代码完成和语法高亮是 IDE/编辑器的功能,与 Angular 或 TypeScript 无关。
  • @ThomasSablik 你认为 IDE 怎么知道提示什么?它肯定与 Angular 有关,它被称为 @angular/language-service
  • @RobertoZvjerković IDE 解析代码。因此,不同的 IDE 在代码完成和语法高亮方面有不同的行为。我每天都在使用 IntelliJ 和 VSCode,语法高亮和代码完成方面的差异很大。即使是同一 IDE 或编辑器的两个版本之间的差异也可能很大。这不是关于 Angular 或 TypeScript 的问题。这是关于 IDE 或编辑器的问题。你不会问 Angular 或 TypeScript 团队的人。你应该问 IntelliJ 团队。
  • @RobertoZvjerković 如果实际转译或构建过程失败,这是一个 Angular 或 TypeScript 问题。
  • @ThomasSablik 假设我创建了一种名为 Roberto++ 的语言。我不提供语言 API 和文档。您认为 IDE 如何提供提示和自动完成功能?提示(双关语):它不能。在 Angular 提供 @angular/language-service 之前,没有 IDE 提供 Angular 模板自动完成功能。这也是 Typescript 的事情,因为 TS 为 Angular 提供了可以使用的类型。

标签: intellij-idea visual-studio-code code-completion angular-language-service


【解决方案1】:

在最新的 IDEA 版本中对我来说很好用:

编辑: 似乎特定于正在使用的库版本,在 WEB-49995

上跟踪

【讨论】:

  • IntelliJ IDEA 2020.3.2(终极版),Build #IU-203.7148.57, built on January 26, 2021,TypeScript:4.0.5。你能澄清一下哪个组件对此负责吗?即它是 IntelliJ 插件还是 angular-language-service?
  • 这是一个插件;自 2019.1 版起不再使用/不需要 Angular 语言服务,我们已将所有 Angular 编译器验证作为检查来实现,这具有一些额外的好处,即能够提供一些基本的快速修复,例如添加缺少的 selector 属性,或其他简洁的东西作为自动模块导入
  • 您是否启用了 Typescript 语言服务?
  • 我刚刚下载了 Stackblitz 项目并在 IntelliJ 中打开它,一切正常。所以它的一些设置 /libs 必须不同。我会试着找出答案..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 2020-08-29
  • 2010-09-15
  • 2014-06-07
  • 2022-01-27
  • 1970-01-01
相关资源
最近更新 更多