typescript TS2531:对象可能为“null”

wecizke3  于 2023-01-14  发布在  TypeScript
关注(0)|答案(7)|浏览(551)

我有以下职能:

uploadPhoto() {
    var nativeElement: HTMLInputElement = this.fileInput.nativeElement;

    this.photoService.upload(this.vehicleId, nativeElement.files[0])
        .subscribe(x => console.log(x));
}

但是在nativeElement.files [0]上,我得到了一个打字错误,“Object is possible 'null'”。有人能帮我解决这个问题吗?
我尝试将nativeElement声明为空值,但是没有成功。
谢谢你的帮助和时间。

lnlaulya

lnlaulya1#

files被定义为FileList | null,因此它可以是null
您应该检查null(使用if),或者如果您确定它不是null,则使用"非空Assert运算符"(!):

if(nativeElement.files != null) {
    this.photoService.upload(this.vehicleId, nativeElement.files[0])
        .subscribe(x => console.log(x));
}

//OR
this.photoService.upload(this.vehicleId, nativeElement.files![0])
    .subscribe(x => console.log(x));
    • 注:**

"非空Assert操作符"不会执行任何运行时检查,它只是告诉编译器您有特殊信息,并且您知道nativeElement.files在运行时不会是null
如果nativeElement.files在运行时是null,它将生成一个错误。这不是其他语言的安全导航操作符。

xoefb8l8

xoefb8l82#

TypeScript 3.7于2019年11月发布。现在支持“可选链接”,这是处理可能为空值的最简单、最安全的方法:
你只需写:

nativeElement?.file?.name

注意问号!它们检查是否为null/undefined,并且只在没有属性(用点链接)为null/undefined时返回值。

代替

if(nativeElement!=null && nativeElement.file != null) {
  ....
}

但想象一下更复杂的情况:crm.contract?.person?.address?.city?.latlang,否则检查起来要冗长得多。

7gyucuyw

7gyucuyw3#

除了上面提到的所有答案之外,如果用户不希望在其应用程序中进行严格的空值检查,我们可以简单地禁用tsconfig.json文件中的strictNullChecks属性。

{
 ...
 "angularCompilerOptions": {
 "strictNullChecks": false,
 ...
 }
}
wkftcu5l

wkftcu5l4#

如果你确定在所有情况下都有一个文件,你需要编译器来确定。

(nativeElement.files as FileList)[0]
4jb9z9bj

4jb9z9bj5#

使用Markus的答案(引用了可选链接),我解决了您的问题,方法是将nativeElement转换为HTMLInputElement,然后使用.item(0)和可选链接运算符?.访问0th文件

uploadPhoto() {
    var nativeElement = this.fileInput.nativeElement as HTMLInputElement

    this.photoService.upload(this.vehicleId, nativeElement?.files?.item(0))
        .subscribe(x => console.log(x));
}
bnlyeluc

bnlyeluc6#

谢谢。我也遇到过同样的问题。在旧版本中,Ionic还不错。在更新TS2531之后。现在函数有两个非空Assert操作符:

async saveToStorage(jsonMessage){
  await this.storage.set(jsonMessage["key"],jsonMessage["value"]);
  document.getElementsByTagName('iframe').item(0)!.contentWindow!.postMessage'{"type": "storage-save","result": "ok","key": "' + jsonMessage["key"] + '"}',"*");
}
kq4fsx7k

kq4fsx7k7#

app.component.html

Enter your Name :<input [value]="data1" (input)='data1=$event.target.value'><br>
Enter name :{{data1}}

app.component.ts

data1:any = 'yash';

相关问题