打字稿中的'EventTarget'类型错误中不存在属性'files'

Chi*_*ari 32 typescript ionic2 exif-js angular

我试图从我的离子2应用程序访问输入文件的值,但我仍然面临类型'EventTarget'上不存在属性文件的问题.因为它适用于js而不是打字稿.代码如下:

  document.getElementById("customimage").onchange= function(e?) {
            var files: any = e.target.files[0]; 
              EXIF.getData(e.target.files[0], function() {
                  alert(EXIF.getTag(this,"GPSLatitude"));
              });
          }
Run Code Online (Sandbox Code Playgroud)

请帮我解决这个问题,因为它没有构建我的离子2应用程序.

sor*_*deh 45

您可以将其强制转换HTMLInputElement:

document.getElementById("customimage").onchange= function(e: Event) {
    let file = (<HTMLInputElement>e.target).files[0];
    //rest of your code...
}
Run Code Online (Sandbox Code Playgroud)

  • 这为我解决了。我会接受它作为正确的答案。 (2认同)

Diu*_*lei 35

e.target属性类型取决于你正在返回的元素getElementById(...).filesinput元素的属性:https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement

在这种情况下,TypeScript编译器不知道您正在返回一个input元素,并且我们没有Event特定于此的类.因此,您可以创建一个类似以下代码:

interface HTMLInputEvent extends Event {
    target: HTMLInputElement & EventTarget;
}

document.getElementById("customimage").onchange = function(e?: HTMLInputEvent) {
    let files: any = e.target.files[0]; 
    //...
}
Run Code Online (Sandbox Code Playgroud)

  • @Tomer,更有可能是因为没有失去打字稿类型的优点.每次使用"任何"时,都会移除防护类型. (5认同)
  • 正如下面有人建议的那样,您可以只使用:“e:any”。我想知道使用这里提供的方法有什么优点? (3认同)

Dev*_*ark 9

这是更多行,但是我认为这是最清楚的。

const onChange = (event: Event) => {
  const target= event.target as HTMLInputElement;
  const file: File = (target.files as FileList)[0];
  /** do something with the file **/
};
Run Code Online (Sandbox Code Playgroud)

  • 我浏览了至少一半的互联网才找到这个解决方案。向其他开发人员解释为什么强类型在计算中是必要的是相当困难的。非常感谢@Devin Clark (2认同)

shu*_*son 7

最简单的解决方案是声明eany

例如

document.getElementById('customimage').onchange = (e: any) => {
    let files = e.target.files[0];
    ...
};
Run Code Online (Sandbox Code Playgroud)

但是你丢失了类型信息.更安全的方法可能是FileEvent根据https://developer.mozilla.org/en-US/docs/Web/API/FileReader/onload声明自己的类型.

  • 这个答案不太好,在我看来,我们需要始终声明一个类型以获得更清晰和理解 (4认同)

nki*_*tku 6

const onChange => (event: Event): void {
    const input = event.target as HTMLInputElement;

    if (!input.files?.length) {
        return;
    }

    const file = input.files[0];
    console.log(file);
}
Run Code Online (Sandbox Code Playgroud)


小智 5

// use - ChangeEvent<HTMLInputElement>

document.getElementById("customimage").onchange= function(e?: ChangeEvent<HTMLInputElement>) {
            var files: any = e.target.files[0]; 
              EXIF.getData(e.target.files[0], function() {
                  alert(EXIF.getTag(this,"GPSLatitude"));
              });
          }
Run Code Online (Sandbox Code Playgroud)

  • 我认为这个答案应该被接受。至少它对我有用。 (2认同)

小智 5

const handleFileInput = (event: ChangeEvent) => {
        const target = event.target as HTMLInputElement;
        const file: File = (target.files as FileList)[0];
        /** do something with the file **/
    };
Run Code Online (Sandbox Code Playgroud)

我会Event改为ChangeEvent,但是德文克拉克的其余答案很棒:)