【问题标题】:TypeScript asking to add type to key valueTypeScript 要求将类型添加到键值
【发布时间】:2020-05-26 20:00:34
【问题描述】:

我的 Angular 项目中有表格。此表单包含带有图像上传的输入。所以我使用 FormData 将数据发送到服务器。我尝试使用函数将表单字段附加到 FormData。

export function toFormData<T>(formValue: T) {
    const formData = new FormData();

    for (const key of Object.keys(formValue)) {
        const value = formValue[key];  <--- error here
        formData.append(key, value);
    }

    return formData;
}

sendForm() {
    const team = toFormData(this.form.value);
    this.teamService.sendTeam(team).subscribe(() => {});
}

我收到来自 ts-lint 的错误“元素隐式具有 'any' 类型,因为 'string' 类型的表达式不能用于索引类型 'unknown'。没有参数类型为 ' 的索引签名在类型 'unknown' 上找到 string'”。 IDE 下划线 formValue[key] 表达式。尝试添加类型,但没有帮助。

【问题讨论】:

    标签: angular typescript


    【解决方案1】:

    formValue[key] 是 any,因为 T 不会缩小类型,这很好。

    要抑制此错误,您需要将any 转换为unknown,就像T extends Record&lt;string, unknown&gt; 一样。现在这意味着value 具有未知类型,应该在使用变量之前先声明它。

    export function toFormData<T extends Record<string, unknown>>(formValue: T) {
        const formData = new FormData();
    
        for (const key of Object.keys(formValue)) {
            const value = formValue[key];
            // feel free to remove Blob if it's not your case.
            if (typeof value !== 'string' && !(value instanceof Blob)) {
                continue;
            }
            formData.append(key, value);
        }
    
        return formData;
    }
    

    【讨论】:

    • 你遇到什么错误?你可以尝试缩小T,如果你不希望有任何其他类型&lt;T extends object&gt;。我也更新了答案,将any 替换为unknown。
    • 完成,现在它应该可以为你工作,即使没有关键演员问题。
    猜你喜欢
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 2021-06-01
    • 1970-01-01
    • 2020-04-30
    相关资源
    最近更新 更多