javascript - Vue.js + TS 对象在文件输入时可能为“空”
问题描述
我试图在文件输入上传文件后捕获一个事件。
JS代码:
fileSelected(e: Event) {
if ((<HTMLInputElement>e.target).files !== null && (<HTMLInputElement>e.target).files[0] !== null) {
this.file = (<HTMLInputElement>e.target).files[0];
}
}
我的文件变量被定义为null。我想选择文件的第一个元素,但出现错误:
对象可能为空
我找到了一个解决方案,您首先必须检查它是否不为空,但是我在 if 语句本身上遇到了同样的错误。有任何想法吗?
解决方案
那是因为 TypeScript 无法在您共享的代码中执行类型缩小。如果您 (1) 将它们分配给变量并 (2) 在逻辑中添加保护子句以强制执行非空值检查,则应该可以解决问题:
fileSelected(e: Event) {
const target = e.target as HTMLInputElement;
const files = target.files;
// Guard clause to catch cases where `files` or `files[0]` is falsy (null included)
if (!files || !files[0])
return;
// At this point, both `files` and `files[0]` will be non-null
// And `files` will have an inferred type of `FilesList` instead of `FilesList | null`
this.file = files[0];
}
推荐阅读
- json - 如何跳过 json4s 中字段的反序列化
- c# - 无法在 asp.net 中发送电子邮件
- json - 从 URL 下载嵌套 JSON 并制作 Observable Object SwiftUI,错误:“在调用中缺少参数 'from' 的参数”
- python - 带有函数和 scipy 的多个参数
- html - 如何使用过度扩展和占用额外空白的图像来纠正 Boostrap 卡?
- python - 我的 Python 代码执行模糊逻辑时出错
- vim - 为什么 Vim 中的外部命令每次都会导致我的 .zshenv 被获取?
- laravel - 如果我使用 Laravel Sail,我应该使用什么 SESSION_DOMAIN?
- javascript - javscript - 从从第三方源加载的 js 中删除字符串代码
- android - Android RecyclerView setVisibility 无法正常工作