ChatGPT解决这个技术问题 Extra ChatGPT

Typescript:如何为嵌套对象定义接口?

假设我有一个 JSON 有效负载,它解析为如下内容:

{
    name: "test",
    items: {
        "a": {
            id: 1,
            size: 10
        },
        "b": {
            id: 2,
            size: 34
        }
    }
}

我将如何设置 Example 接口的定义来建模 items 属性的值是一个对象,其键是字符串并且其值由 Item 接口定义:

export interface Example {
    name: string;
    items: ???;

}

export interface Item {
    id: number;
    size: number;
}

J
Josh Crozier

Typescript 允许您使用语法 [key: string] 添加对象键的类型。

如文档中所述,这些称为 indexable types

可索引类型有一个索引签名,它描述了我们可以用来索引对象的类型,以及索引时相应的返回类型。

在您的情况下,您将使用以下内容:

export interface Item {
    id: number;
    size: number;
}

export interface Example {
    name: string;
    items: {
        [key: string]: Item
    };
}

作为参考,这里有一个 link to a live example


为什么要导出Item接口?仅导出 Example 接口还不够吗?
@AlexanderKim 是的,除非 Item 对使用这些类型的其他代码也有用。
有谁知道如何使用状态设置项目键并访问它们?
感谢这一点,我在访问另一个类的一个类文件中定义的接口时遇到问题。我没有定义导出接口。添加导出后,页面的导入允许我导入类和界面,谢谢。
非常欢迎您,您的回答对我非常有用。谢谢!
w
walkeros

你可以想用 Record 类型来实现

interface Item {
    id: number;
    size: number;
}


interface Example2 {
   name: string;
   items : Record<string, Item>; 

}

var obj2: Example2 = {
    name: "test",
    items: {
        "a": {
            id: 1,
            size: 10
        },
        "b": {
            id: 2,
            size: 34
        },
        "c": {
            id: 3,
            size: 34
        }
    }
}

您还将获得编译时检查:

https://i.stack.imgur.com/y4gOs.png