Vscode-ng-language-service: typescript 2.7 严格的属性初始化会破坏类型推断

创建于 2018-02-03  ·  6评论  ·  资料来源: angular/vscode-ng-language-service

我使用新的严格属性初始化功能升级到 typescript 2.7: https :

这意味着如果强制属性未在构造函数中初始化,它将发出警告。 这在强制组件输入中很常见。 它们不是从构造函数设置的,所以 TS 会抱怨:

@Component(...)
export class AppComponent {
  @Input() foo: Foo;
}

因为 foo 从未被初始化。 您可以通过手动断言在初始化期间设置属性来解决此问题(注意 foo 属性声明中的感叹号):

@Component(...)
export class AppComponent {
  @Input() foo!: Foo;
}

但是,一旦执行此操作,vs 代码中 angular 语言服务的类型推断就会中断,并显示错误[Angular] Identifier 'name' is not defined. '<anonymous>' does not contain such a member
image

对于复制仓库,请参阅https://github.com/wvanderdeijl/angular-strict-prop-init

最有用的评论

好消息是刚刚发布的 0.1.10 版本支持 TS 2.7。 坏消息是我仍然看到这个错误,它可能与这个问题有关。 被引用的对象有一个键索引签名,而不是一个明确的赋值断言,但症状是一样的。 如果是同样的问题,请参阅 #149 和 #126。

所有6条评论

不幸的是,Angular 不支持 TS 2.7。 既然已经正式发布,Angular 应该会尽快添加支持。

@hccampos有您知道的解决方法吗? 在我的 HTML 中得到同样的废话。

@wvanderdeijl同时使用"strictPropertyInitialization": false, 。 我也在使用 ts 2.7,不仅因为 --watch 速度更快,而且它修复了 vscode 中的相对自动导入。

从长远来看,我看不到任何合理的方法,角度如何能够解决这个问题。 我想最好始终为您的 Inputs 提供默认值,而不必使用明确的赋值断言修饰符!

或者要以编程方式正确打开标志并执行以下操作:

@Component({
  selector: 'app-test',
  template: '<div>{{ foo?.name }}</div>'
})
export class AppComponent {
  // foo can be undefined
  // both TS 2.7 and language service will compile correctly
  @Input() foo?: Foo;
  // or you can write @Input() foo: Foo | void = undefined; which is the same as above, just more explicit
}

为什么没问题? 角度编译器没有任何能力如何制作真正需要的道具,
所以即使你不会在类中使 Input 成为“必需的”,你仍然可以写<app-test><app-test>并且编译器根本不会抛出任何错误,即使属性 Input 不是可选的👎

好消息是刚刚发布的 0.1.10 版本支持 TS 2.7。 坏消息是我仍然看到这个错误,它可能与这个问题有关。 被引用的对象有一个键索引签名,而不是一个明确的赋值断言,但症状是一样的。 如果是同样的问题,请参阅 #149 和 #126。

结束这个,因为 Angular 现在使用 TypeScript 3.6。
请升级到最新版本,如果您仍然遇到此问题,请告诉我们。 谢谢!

由于不活动,此问题已自动锁定。
如果您遇到类似或相关的问题,请提交新问题。

阅读有关我们的自动对话锁定政策的更多信息。

_此操作已由机器人自动执行。_

此页面是否有帮助?
0 / 5 - 0 等级