我使用新的严格属性初始化功能升级到 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
:
对于复制仓库,请参阅https://github.com/wvanderdeijl/angular-strict-prop-init
不幸的是,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.1.10 版本支持 TS 2.7。 坏消息是我仍然看到这个错误,它可能与这个问题有关。 被引用的对象有一个键索引签名,而不是一个明确的赋值断言,但症状是一样的。 如果是同样的问题,请参阅 #149 和 #126。