“FileList”类型上不存在 TypeScript 属性“forEach”

Posted

技术标签:

【中文标题】“FileList”类型上不存在 TypeScript 属性“forEach”【英文标题】:TypeScript Property 'forEach' does not exist on type 'FileList' 【发布时间】:2018-11-09 06:49:55 【问题描述】:

我允许用户上传多个文件。然后我需要遍历这些文件并执行一些操作。我想为FileList 添加一些额外的功能,但TS 不知道FileList 数组上的forEach。这是我的代码:

public uploadMultiple(evt)
    console.log(evt.files);
    FileList.prototype.forEach = function(callback) [].forEach.call(this, callback);

【问题讨论】:

.forEach 是原生 javascript Array.prototype 的属性。在 Typescript 中,如果你想为 FileList 类添加功能,你可以在 FileList 类声明中进行……优先考虑经典继承而不是原型。 @Rob_M 不正确,您通常可以扩充现有声明。 【参考方案1】:

您需要在FileList 接口上声明额外的函数,然后才能分配它。您可以使用声明合并来做到这一点。如果您使用的是模块系统,则需要在global 中声明合并的接口:

declare global 
    interface FileList 
        forEach(callback: (f: File) => void) : void;
    

FileList.prototype.forEach = function(callback)   ... ;

【讨论】:

【参考方案2】:

FileList 不能与数组混淆。该列表是具有其他属性的迭代器,例如 lengthitem

一种可能的解决方案是使用 for 循环,我认为这是最好的方法。

for (let i = 0; i < files.length; ++i) 
    const file = files[i];
    ...

https://developer.mozilla.org/en-US/docs/Web/API/FileList

【讨论】:

【参考方案3】:
imagList: Array<any> = [];

uploadMultiple(event) 
        let reader = new FileReader();
        this.imagList.pop();
        if (event.target.files && event.target.files.length > 0) 
            for (var i = 0; i < event.target.files.length; i++) 
                this.imagList[i] = event.target.files[i];
            
            var formData = new FormData();
            for (var i = 0; i < this.imagList.length; i++) 
            formData.append("File", <string>this.imagList[i]);
        
        
     

你可以试试这个对我有用。

【讨论】:

【参考方案4】:
const target = event.target as htmlInputElement;
(target.files as unknown as File[]).forEach((newFile) => 
    // do something
);

我也可以推荐这个解决方案。这是一个简单的班轮。保持简单愚蠢。但请选择您喜欢的任何解决方案。

【讨论】:

为什么你更喜欢这种表达方式而不是公认的答案——或者其他任何一个之前的答案?为什么未来的读者应该考虑使用它呢?它是否更适合特定场景?它是否使用提供一些好处的新语法?请解释一下。 嘘嘘嘘嘘 我没有关注。你能扩展你的答案吗? 你也许应该专注于你的重要问题,而不是在这里肆虐,但可以肯定。我有同样的问题,这里的解决方案不适合。所以我添加了我最终得到的解决方案。有多种解决方案可供选择总是好的。 我只是重读了我的评论,但我似乎并不生气。这当然不是故意的。我的目标是促使贡献者改进他们的答案,以便更好地帮助未来的读者。如果你觉得我的评论很粗鲁,请随意标记它。如果你认为审稿人不应该留下这样的反馈,我鼓励你在 Meta Stack Overflow 上提出这个问题。无论如何,我祝你一切顺利。我也希望您能花时间编辑您的答案以解决我的反馈;这会让它更有用,更有可能在这里建立你的声誉。

以上是关于“FileList”类型上不存在 TypeScript 属性“forEach”的主要内容,如果未能解决你的问题,请参考以下文章

类型“typeof ...”上不存在属性“use”,类型“typeof”上不存在属性“extend”

TypeScript:类型“”上不存在属性

错误 TS2339:类型“”上不存在属性“包含”

类型“”上不存在属性“forEach”

类型“”上不存在 Typescript 错误属性“成员”

类型“T”上不存在属性 - 一般问题