首页 > 解决方案 > TypeScript 在迭代中获取对象值

问题描述

我需要访问我的对象的值。

目的:

private filters: any = {
        id: {
            focused: false,
            options: true,
            value: null,
        },
        user_name: {
            focused: false,
            options: true,
            value: null,
        }
}

我像这样遍历它们:

for (const [key, filter] of Object.entries(this.filters)) {
    console.log(key);
    console.log(filter.value);
}

问题是我无法到达 filter.value,因为“对象的类型未知”。我试图将对象类型设置为对象而不是任何。但在那之后我无法达到这样的过滤器对象值:

this.filters.id.value = value;

它说

“对象”类型上不存在属性“id”

有任何想法吗?

标签: javascripttypescripttypesstrict

解决方案


发生这种情况是因为您懒惰地将过滤器键入为any. 您可以通过为过滤器定义一个接口然后使用它来解决此问题:

interface Filter
{
    focused: boolean;
    options: boolean;
    value: number | null; // TODO: type this
}
private filters: Record<string, Filter> = {
        // ...
}

Record类型在这里指定,对于 type 的每个键,属性string的值都具有 type Filter

在这种特定情况下,您也可以只删除类型注释,编译器会发现过滤器对象的形状是相同的,并且每个过滤器都具有该value属性。但是,如果没有使用不再是选项的对象文字创建过滤器。


推荐阅读