【问题标题】:Cannot extend typescript File无法扩展打字稿文件
【发布时间】:2018-05-30 18:29:12
【问题描述】:

我正在创建一个拖放界面。在下降时,我得到了原生的File。我需要扩展这个接口并包含一些其他信息。

我的第一个方法是使用

interface AcceptedFile extends File {
   acl: Acl,
   disabled: boolean;
}

const toAcceptedFiles = (files: File[]): AcceptedFile[] => {
   return files.map(file => {
      return {
         ...file,
         acl: Acl.Public,
         disabled: false
      }
   });
}

然而,函数toAcceptedFiles的结果,只包含来自Filepreview键;所有的斑点、名称等都消失了。如果我在toAcceptedFilesconsole.log file,我可以看到所有的键。

有趣的是,以下界面可以正常工作:

interface AcceptedFile {
   file: File,
   acl: Acl,
   disabled: boolean;
}

为什么扩展 File 会破坏它?

【问题讨论】:

  • 我很确定您可能不能只复制本机 File 对象,同时还期望它继续工作。它可能有一些您根本无法访问的内部属性(例如,存储数据的内存指针或特定于浏览器的东西)。因此,您可能应该将其包装在自定义对象中,而不是将其复制到自定义类型。

标签: javascript typescript type-conversion typescript-typings


【解决方案1】:

为什么第一种方法行不通 spread operator issues with property accessors (getters)

您的第二种方法更合理,因为本机 api 将返回给您一个 File[],您希望将其映射到您的类型 AcceptedFile

const toAcceptedFiles = (files: File[]): AcceptedFile[] => {
   return files.map(file => {
      return {
         file: file,
         acl: Acl.Public,
         disabled: false
      }
   });
}

当从本机 API 调用 toAcceptedFiles 时,它将填充 File[] 而不是 AcceptedFile[]

interface AcceptedFile {
   file: File;
   acl: Acl,
   disabled: boolean;
} 

【讨论】:

  • 但这不是我的问题。我的onDrop 函数接受File[]。然后我将它传递给toAcceptedFiles,但是当它被转换时,它丢失了关于文件的所有 blob 信息。我的第一种方法甚至不起作用
  • 我很确定传播运算符 ...file 正在破坏某些东西
  • 您是否将acldisabled 设为可选?
  • 是的,同样的问题是,如果我在控制台记录我从toAcceptedFiles 获得的内容,它只包含属性acldisabledpreview。但是console.logging的file里面的map函数,也会显示大小、类型、名称等
  • {...file} 执行实际 File 的浅拷贝,因此大部分实际数据将丢失。
猜你喜欢
  • 2021-01-04
  • 2019-09-18
  • 2019-06-27
  • 2020-07-07
  • 1970-01-01
  • 2013-12-23
  • 2019-05-04
  • 1970-01-01
相关资源
最近更新 更多