打字稿:如何定义嵌套对象的接口?

bin*_*nce 68 typescript

假设我有一个JSON有效负载,解析成这样的东西:

{
    name: "test",
    items: {
        "a": {
            id: 1,
            size: 10
        },
        "b": {
            id: 2,
            size: 34
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

}

export interface Item {
    id: number;
    size: number;
}
Run Code Online (Sandbox Code Playgroud)

Jos*_*ier 108

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

如文档中所述,这些称为可索引类型:

索引的类型有描述,我们可以使用索引到的对象的类型,与相应的返回类型索引时沿指数的签名.

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

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

export interface Example {
    name: string;
    items: {
        [key: string]: Item
    };
}
Run Code Online (Sandbox Code Playgroud)

作为参考,这里是一个实例链接.

  • @AlexanderKim 是的,除非 `Item` 对使用这些类型的其他代码也有用。 (4认同)
  • 为什么要导出`Item`接口?仅仅输出`Example`接口还不够吗? (2认同)

wal*_*ros 9

你想要的可以使用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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您还将获得编译时间检查:

在此输入图像描述