【问题标题】:TS2322: Type 'File' is not assignable to type 'typeof File'TS2322:类型“文件”不可分配给类型“文件类型”
【发布时间】:2018-10-26 16:58:13
【问题描述】:

TS2322:类型“文件”不可分配给类型“文件类型”。 类型“文件”中缺少属性“原型”。

我收到此错误。我不知道为什么我得到它,我不知道如何解决它。如果有人愿意帮我一把,我将不胜感激!

我有这个公共类属性:

registry = File;

getRegistryFile 函数:

private async getRegistryFile(): Promise<File> {
        if (this.files === undefined || this.files.length === 0) {
            return Promise.reject('No files where returned from the server.');
        }

        const registryFileName = await this.createRegistryFileName();

        this.files.forEach((element) => {
            if (element === registryFileName) {
                console.log('File registry found.');
                return Promise.resolve(element);
            }
        });
    }

还有我正在构建的函数:

public WorkInProgress(file: File) {
    this.getRegistryFile().then((file) => this.registry = file);
}

【问题讨论】:

    标签: typescript asynchronous types


    【解决方案1】:

    我有这个公共类属性:

    registry = File;
    

    这是registry 属性的声明,它应该具有File 类型?那么应该是

    registry: File;
    

    或者它是包含File 类构造函数的属性的初始化?那么它的类型真的是typeof File,不能作为File的实例。

    【讨论】:

    • 你是对的。我搞砸了声明。感谢您指出!
    【解决方案2】:

    参见@artem 的推荐:应该是registry: File 而不是registry = File 此外,您不能从 Array.forEach() 返回值(您正在尝试返回 Promise),而是这样做:

    private async getRegistryFile(): Promise<File> {
        if (this.files === undefined || this.files.length === 0) {
            return Promise.reject('No files where returned from the server.');
        }
    
        const registryFileName = await this.createRegistryFileName();
    
        for (let element of this.files) { // replaced Array.forEach with for-of loop
            if (element === registryFileName) {
                console.log('File registry found.');
                return Promise.resolve(element);
            }
        };
        return Promise.reject(new Error("File not found"));
    }
    

    【讨论】:

    • 感谢您指出这一点。但是我现在的下一个问题是:为什么我不能从 for each 中返回?这似乎很随意。
    • 我发现了这个:stackoverflow.com/questions/43555904/… 是否有一个特殊的规则可以用来知道函数何时允许我返回值?还是我需要搜索每个循环机制并记住?
    • @MaestroMaus,你可以看Array.prototype.forEach的文档(看here)。如您所见,.forEach 需要一个不返回值的回调函数,因此,如果它返回一个值,它将忽略它。将.forEach 视为:for (let i = 0; i &lt; array.length; i++) callback(item, i, array)。如您所见,它与callback() 的结果无关。换句话说,RTFM ;)
    猜你喜欢
    • 2020-12-27
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 2018-07-01
    • 2017-04-10
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多