Property 'xx' does not exist on type 'Element | Element[] | Vue | Vue[]'

简介: Property 'xx' does not exist on type 'Element | Element[] | Vue | Vue[]'

Vue2.6 + TypeScript3.4 项目中使用 this.$refs.fileInput.files.length 报错,提示 files 类型不存在 Property 'files' does not exist on type 'Element | Element[] | Vue | Vue[]'

如下一个 fileChange 函数

  private fileChange() {
    if (this.$refs.fileInput.files.length > 0) {
      this.file = this.$refs.fileInput.files[0]
      const reader = new FileReader()
      const self = this
      reader.readAsDataURL(this.file)
      reader.onload = (e: any) => {
        const dataBase64: any = reader.result
        self.userInfo.avatar = dataBase64
      }
    }
  }

template

<input ref="fileInput" type="file" @change="fileChange()" />

在不使用TypeScript时上面的写法可以正常运行的,但是这样的写法在TypeScript 中会报错,终端报错如下

534:40 Property 'files' does not exist on type 'Element | Element[] | Vue | Vue[]'.
  Property 'files' does not exist on type 'Element'.
    532 |   private fileChange() {
    533 |     if (this.$refs.fileInput.files.length > 0) {
  > 534 |       this.file = this.$refs.fileInput.files[0]
        |                                        ^
    535 |       const reader = new FileReader()
    536 |       const self = this
    537 |       reader.readAsDataURL(this.file)
No lint errors found
Version: typescript 3.8.3, tslint 5.20.1
Time: 1413ms
  App running at:
  - Local:   http://localhost:8080/ 
  - Network: http://192.168.199.172:8080/

image.png

解决方式

因为TypeScript需要知道属性是什么类型,这里需要强制类型转换

this.$refs.fileInput.files.length 换成 (this.$refs.fileInput as Vue & { files: () => any }).files.length

this.file = this.$refs.fileInput.files[0] 换成 const fs: any = (this.$refs.fileInput as Vue & { files: () => any }).filesthis.file = fs[0]

最后如下效果,代码就可以正常运行了

  private fileChange() {
    if ((this.$refs.fileInput as Vue & { files: () => any }).files.length > 0) {
      const fs: any = (this.$refs.fileInput as Vue & { files: () => any }).files
      this.file = fs[0]
      const reader = new FileReader()
      const self = this
      reader.readAsDataURL(this.file)
      reader.onload = (e: any) => {
        const dataBase64: any = reader.result
        self.userInfo.avatar = dataBase64
      }
    }
  }

参考来源

stackoverflow.com/questions/5…

相关文章
|
4天前
|
缓存 监控 JavaScript
探讨优化Vue应用性能和加载速度的策略
【5月更文挑战第17天】本文探讨了优化Vue应用性能和加载速度的策略:1) 精简代码和组件拆分以减少冗余;2) 使用计算属性和侦听器、懒加载、预加载和预获取优化路由;3) 数据懒加载和防抖节流处理高频事件;4) 图片压缩和选择合适格式,使用CDN加速资源加载;5) 利用浏览器缓存和组件缓存提高效率;6) 使用Vue Devtools和性能分析工具监控及调试。通过这些方法,可提升用户在复杂应用中的体验。
16 0
|
5天前
|
JavaScript 前端开发
vue(1),小白看完都会了
vue(1),小白看完都会了
|
5天前
|
JavaScript 数据库
ant design vue日期组件怎么清空 取消默认当天日期
ant design vue日期组件怎么清空 取消默认当天日期
|
5天前
|
JavaScript C++
vue高亮显示组件--转载
vue高亮显示组件--转载
9 0
|
4天前
|
设计模式 JavaScript 前端开发
Vue3报错Property “xxx“ was accessed during render but is not defined on instance
Vue3报错Property “xxx“ was accessed during render but is not defined on instance
|
4天前
|
JavaScript 开发工具 git
Vue 入门系列:.env 环境变量
Vue 入门系列:.env 环境变量
10 1
|
5天前
|
JavaScript 前端开发 定位技术
Vue使用地图以及实现轨迹回放 附完整代码
Vue使用地图以及实现轨迹回放 附完整代码
Vue使用地图以及实现轨迹回放 附完整代码
|
5天前
|
JavaScript
Vue中避免滥用this去读取data中数据
Vue中避免滥用this去读取data中数据
|
5天前
|
JavaScript
vue中使用pinia及持久化
vue中使用pinia及持久化
8 0
|
5天前
|
JavaScript 前端开发 UED
Vue class和style绑定:动态美化你的组件
Vue class和style绑定:动态美化你的组件