角度错误 TS2531:对象可能为“空”
Posted
技术标签:
【中文标题】角度错误 TS2531:对象可能为“空”【英文标题】:Angular error TS2531: Object is possibly 'null' 【发布时间】:2021-07-11 09:13:03 【问题描述】:所以我有一个 Component.html,其中包含如下输入:
<input type="text" (change) = "setNewUserName($event.target.value)"/>
component.ts 是:
import Component from "@angular/core";
@Component(
selector : 'app-users-list',
templateUrl : './usersList.component.html'
)
export class UsersListComponent
setNewUserName (userName : string): void
console.log('setNewUserName', userName)
最后 module.ts 是:
@NgModule (
declarations: [UsersListComponent],
imports : [CommonModule],
exports: [UsersListComponent]
)
export class UsersListModule
运行服务器时,弹出如下错误:
error TS2531: Object is possibly 'null'.
1 <input type="text" (change) = "setNewUserName($event.target.value)"/>
~~~~~
【问题讨论】:
你为什么不使用([ngModel])
如果这是反应形式那么你可以在AfterViewInit
this.reactiveForm.valueChanges.subscribe(x => console.log('form value changed') console.log(x) )
下检查你可以使用它。
恐怕我不太明白你指的是什么。这实际上是我的第一个 Angular 应用程序,所以我是新手。
使用“安全”运算符?
:setNewUserName($event.target?.value)
。顺便说一句,您可以使用 [(ngModel)] 来绑定两个方向-或 [ngModel] (ngModelChange)-
我尝试了安全运算符,我也尝试使用 this.value 但它们都返回错误
【参考方案1】:
你在使用 Angular Ivy 吗?很可能是因为 Ivy AOT 中的 template type checking。
尽管如此,有多种选择
选项 1:将事件作为参数发送
<input type="text" (change) = "setNewUserName($event)"/>
export class UsersListComponent
setNewUserName (event: any): void
console.log('setNewUserName', event.target.value)
选项 2:使用模板引用变量
<input #userName type="text" (change) = "setNewUserName(userName.value)"/>
export class UsersListComponent
setNewUserName (userName : string): void
console.log('setNewUserName', userName)
选项 3:使用 $any()
禁用类型检查
<input type="text" (change) = "setNewUserName($any($event.target).value)"/>
export class UsersListComponent
setNewUserName (userName : string): void
console.log('setNewUserName', userName)
选项 4:模板驱动或反应式表单
使用template-driven 或reactive 表单获取输入值。 IMO 这将是最优雅的方法。
更新:添加disable type checking
【讨论】:
第二种解决方案确实有效。为什么 $ 命令不起作用?请问我该如何解决这个问题? 第一个解决方案(“发送事件”)不起作用吗? 错误可能是因为使用 Ivy,渲染引擎需要事先访问属性,在这种情况下,由于事件的性质,这是不可能的。 但是对于第一个解决方案,这不是问题,因为属性value
仅在运行时在触发 change
事件时进行评估。
不,它确实有效。有我拼写错误。非常感谢【参考方案2】:
试试这个
setNewUserName($any($event.target).value);
会有用的
【讨论】:
【参考方案3】:这对我有用
($any($event.target).value);
在 angylar 13 中
【讨论】:
正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。以上是关于角度错误 TS2531:对象可能为“空”的主要内容,如果未能解决你的问题,请参考以下文章
无法解决 ts 错误:对象可能是“未定义”.ts(2532)