Angular 中的文件输入事件类型

Vaa*_*jan 14 typescript typescript-typings angular

所以我一直在使用 Angular 和 Typescript。我似乎无法找出输入文件的类型是什么。

例如:

<input type="file" (change)="fileChangeEvent($event)">

fileChangeEvent(e:?????){}
Run Code Online (Sandbox Code Playgroud)

所有示例仅使用没有任何类型的事件,我很想知道这种类型是否存在。

Chi*_*shi 16

对于 Angular 10 严格类型模式,我们需要在参数中提及类型。您可以按照这种方式从文件输入事件中实现文件列表

// HTML
<input type="file" (change)="uploadFile($event)">

// TS
uploadFile(event: Event) {
    const element = event.currentTarget as HTMLInputElement;
    let fileList: FileList | null = element.files;
    if (fileList) {
      console.log("FileUpload -> files", fileList);
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。请分享您的反馈。


Che*_*pan 8

使用文件

File 接口提供有关文件的信息,并允许网页中的 JavaScript 访问其内容。

尝试这个

组件.html

<input type="file" (change)="fileChangeEvent($event.target.files)">
Run Code Online (Sandbox Code Playgroud)

组件.ts

fileChangeEvent(e: File[]){
    fileName = e[0];
    fileType = fileName.type;
}
Run Code Online (Sandbox Code Playgroud)

  • 我们曾经这样做过(使用类型“FileList | readonly File[]”),但是如果我们激活 Ivy 的 strictTemplates 选项,则会在以下几行上出错:“TS2339:类型“EventTarget”上不存在属性“文件””和“ TS2531:对象可能为“空”。因此,我们要么使用丑陋的“$any($event.target).files”,要么回到类型“$event”。 (4认同)
  • 这可能会起作用,因为您使用类型文件传递文件。但仍然引出了一个问题:$event 是什么类型。只是奇怪的是没有明确的答案。 (3认同)
  • 而且,它并没有太大变化,但是 `e` 不会是一个 `File` 数组,而是一个 `FileList`。最明显的区别是“FileList”没有实现 Iterator 协议,因此“for of”循环不起作用。https://developer.mozilla.org/en-US/docs/Web/API/FileList (2认同)

Saj*_*jad 7

Angular 10 及以上:

组件.html

    <input type="file" (change)="upload($event)">
Run Code Online (Sandbox Code Playgroud)

组件.ts

  upload(event: Event) {
      const target = event.target as HTMLInputElement;
      const files = target.files as FileList;
      console.log(files);
  }
Run Code Online (Sandbox Code Playgroud)