在类型“ {}”上未找到参数类型为“字符串”的索引签名

时间:2020-11-03 08:53:37

标签: reactjs typescript

首先,我将提出问题的布局:

interface FilteredProducts {
    [key: string]: {
        [key: string]: object;
    };
};

我将 filterProducts 初始化为一个空对象,因为我唯一在其中放置值的时间是在if中,所以我需要这样做以供以后使用

products: FilteredProducts
let filteredProducts: object = {};

这里我将一个对象分配给filterProducts->

if (filters.season && filters.dimension) {
        filteredProducts = (products[filters.season] || {})[filters.dimension];
    };

如果设置了特定的过滤器,我想删除该对象的属性

if (productKey && Object.entries(filteredProducts).length > 0) {
       delete filteredProducts[productKey];
}

问题是它说:

元素隐式地具有“ any”类型,因为类型“ string”的表达式不能用于索引类型“ {}”。 在类型'{}'上未找到带有参数'字符串'的索引签名

当我尝试删除此密钥时。

我尝试设置 filteredProducts ->

的类型
interface FilteredInterface {
    [key: string]: object;
}

但是我明白了

类型“对象”不能分配给类型“ FilteredInterface”。 类型“ {}”中缺少索引签名。

当我尝试将该对象分配给filterProducts时。 (第一个 if 中的代码)

这是此部分的完整代码:

interface FilteredProducts {
    [key: string]: {
        [key: string]: object;
    };
};

const filter = (products: FilteredProducts, filters: UserFiltersInterface): object => {
    let filteredProducts: FilteredInterface = {};
    // console.log('products', products);
    // console.log('filters', filters);
    if (filters.season && filters.dimension) {
        filteredProducts = (products[filters.season] || {})[filters.dimension];
    };
    if (filters.tire_size) {
        // console.log('filteredProducts tire_size', filters.tire_size);
        if (Object.entries(filteredProducts).length > 0) {
            // console.log('filteredProducts', filteredProducts);
            if (filters.tire_size !== 'all') {
                Object.entries(filteredProducts).forEach((product) => {
                    const productKey: string = product[0];
                    const productInfo = product[1];
                    if (productInfo.size !== filters.tire_size) {
                        if (productKey && Object.entries(filteredProducts).length > 0) {
                            delete filteredProducts[productKey];
                        }
                    }
                });
            };
        };
    };
    // console.log('filteredProducts', filteredProducts);
    return filteredProducts;
};

1 个答案:

答案 0 :(得分:1)

您需要指定要返回的(products[filters.season])[filters.dimension]是一个FilteredInterface对象。因为您要将其存储在filteredProducts: FilteredInterface中。

您可以在这里完成(替换object):

interface FilteredProducts {
    [key: string]: {
        [key: string]: FilteredInterface;
    };
};

或者在这里(强制转换,您将object保留在FilteredProducts中:

filteredProducts = (products[filters.season])[filters.dimension] as FilteredInterface;

编辑:查看此TS Playground