首先,我将提出问题的布局:
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;
};
答案 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