如何在打字稿中定义这个模型

时间:2016-12-12 17:48:46

标签: typescript typescript-typings

我有一个看起来像这样的json模型

{
    "loggers" : {
        "logger1" : {
            "name" : "logger1",
            "level" : "DEBUG",
            "sub_loggers" :{
                "logger1.nested_logger1" : {
                    "name": "logger1.nested_logger1",
                    "level": "INFO"
                },
                "logger1.nested_logger2" : {
                    "name": "logger1.nested_logger2",
                    "level": "INFO",
                    "sub_loggers": {
                        "logger1.nested_logger2.more_of_that" : {
                            "name": "logger1.nested_logger2.more_of_that",
                            "level": "INFO"
                        }
                    }
                }
            }
        },
        "logger2" : {
            "name": "logger2",
            "level": "WARN"
        }
    }
}

我希望保存模型,因为我从变量中的HTTP请求中收到它,但我希望它被映射,所以我不必使用any

如果有办法将它分成2个模型,我还想要更多, 我只是不知道如何映射它,因为sub_loggers不是数组,它是一个对象,其关键名称也是它们所代表的记录器的名称。

1 个答案:

答案 0 :(得分:2)

这是一个选项:

type Level = "DEBUG" | "INFO" | "WARN" | "ERROR";

type Loggers = {
    [name: string]: Logger;
}

interface Logger {
    name: string;
    level: Level;
    sub_loggers?: Loggers;
}

let json = YOUR_JSON as { loggers: Loggers };
let loggers: Loggers = json["loggers"];

code in playground

修改

回答你的评论问题:

  1. 是的,?标记为optional property
  2. 我还没有使用过课程,我使用了interfacestype aliases
    接口和类型别名之间的差异在链接文档中进行了解释 我还没有使用过类,因为从你的问题来看,你似乎只是想要代表你的json结构,以便编译器使用类型安全。
    如果您需要拥有实际实例以便您拥有功能(方法)而不仅仅拥有数据对象,那么您将需要使用类。