将 Json 映射到带有可选字段的接口 - Typescript

问题描述 投票:0回答:1

我想为以下 json 对象创建一个通用接口:

类型

{"transactionId: "<UUID>", "details": "<message event/action description>", "err": "<Optional, error description>", ...<additional log information>}

输入示例

2044-08-09T02:12:51.253Z - info - {"transactionId":"9abc55b2-807b-4361-9dbe-aa88b1b2e978","details":"Service is started"}
2021-08-09T02:12:51.255Z - info - {"transactionId":"9abc55b2-807b-4361-9dbe-aa88b1b2e821","details":"Service is started"}
2021-08-09T02:12:51.265Z - info - {"transactionId":"9abc55b2-807b-4361-9dbe-aa88b1b2e821","details":"Service is successfully finished"}
2021-08-09T02:12:51.254Z - debug - {"transactionId":"9abc55b2-807b-4361-9dbe-aa88b1b2e978","details":"About to request the user information","userId": 10}
2021-08-09T02:12:51.254Z - debug - {"transactionId":"9abc55b2-807b-4361-9dbe-aa88b1b2e978","details":"About to request user orders list","userId": 10}
2021-08-09T02:12:51.257Z - debug - {"transactionId":"9abc55b2-807b-4361-9dbe-aa88b1b2e821","details":"About to request the user information","userId": 16}
2021-08-09T02:12:51.257Z - debug - {"transactionId":"9abc55b2-807b-4361-9dbe-aa88b1b2e978","details":"User information is gathered","user":{"id":10,"name":"Alice"}}
2021-08-09T02:12:51.258Z - debug - {"transactionId":"9abc55b2-807b-4361-9dbe-aa88b1b2e821","details":"About to request user orders list","userId":16}
2021-08-09T02:12:51.259Z - debug - {"transactionId":"9abc55b2-807b-4361-9dbe-aa88b1b2e821","details":"User information is retrieved","user": {"id": 16, "name": "Michael"}}
2021-08-09T02:12:51.262Z - debug - {"transactionId":"9abc55b2-807b-4361-9dbe-aa88b1b2e821","details":"User information is retrieved","user":{"id":16,"orders":[{"id":472,"items":{"id":7,"price":7.12}}]}}
2021-08-09T02:12:51.264Z - warn - {"transactionId":"9abc55b2-807b-4361-9dbe-aa88b1b2e978","details":"Service finished with error","code":404,"err":"Cannot find user orders list"}
2021-08-09T02:12:51.259Z - error - {"transactionId":"9abc55b2-807b-4361-9dbe-aa88b1b2e978","details":"Cannot find user orders list","code": 404,"err":"Not found"}

必填字段为DatelogLeveltransactionIddetails。其他字段是可选的。

我想将行中的 json 对象映射到接口,但无法创建接口。

您能帮我解决这个问题吗?

谢谢。

json typescript interface
1个回答
0
投票

让我实现jcalz的预言哈哈 在打字稿中创建界面非常简单:

export interface Item {
   requiredItem: number,
   optionalItem?: string,
   ...
}

导出使其可以通过导入访问其声明之外的所有其他文件。现在,如果您希望“可选”项目始终出现,那就会带来不同的挑战。在打字稿中,除非您声明可选项目,否则不会在对象上设置它们。在我们的旧代码中,我们创建函数来处理这样的情况,我们总是需要定义属性:

createItem(values?: any): Item {
     return {
          ...values,
          optionalItem: values.optionalItem ? values.optionalItem : undefined
     } as Item;
}

这有它自己的问题,因为从技术上讲,您将该属性两次应用到您的新模型中。如果您在打字稿中使用“严格”标志,并且您传入的

any
属性不满足接口的要求,该系统也会抛出错误。如果这是您担心的事情,您还可以创建一个函数,该函数单独获取每个属性或具有“必需”对象和“可选”对象并将它们组合在函数中。虽然没有更多背景信息,但我们无法为您提供更多指导。

© www.soinside.com 2019 - 2024. All rights reserved.