【问题标题】:TypeScript getting object value in iterationTypeScript 在迭代中获取对象值
【发布时间】:2020-06-24 17:37:37
【问题描述】:

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

对象:

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”

有什么想法吗?

【问题讨论】:

    标签: javascript typescript types strict


    【解决方案1】:

    这是因为您懒惰地将过滤器输入为any。您可以通过为过滤器定义一个接口然后使用它来解决此问题:

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

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

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

    【讨论】:

    • 太棒了,Record 对我来说是新事物。它有效。
    • @The50:是utility type,你可以手动写成{ [key: string]: Filter }
    • 我可以把它放在哪里?在我的界面里面?
    • @The50:不,这将取代Record&lt;string, Filter&gt;。没有必要;我只是在说明Record 在内部是如何工作的。如果您使用带有 go to definition 的 IDE,您也可以跳转到那里亲自查看。
    猜你喜欢
    • 2021-03-30
    • 2021-03-06
    • 2018-02-23
    • 2016-02-08
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    相关资源
    最近更新 更多