【发布时间】:2019-10-21 00:39:24
【问题描述】:
关注这个问题Dates in a Typescript interface are actually strings when inspected
我为从服务器 API 调用收到的响应定义了一个打字稿接口,该接口有一个参数 Date。由于它以 json 格式出现并且是一个字符串,因此对该参数的进一步调用在 IDE 上有效,但在浏览器上无效,因为它确实是一个字符串。
在使用该参数时,我已经使用 new Date() 解决了这个问题,但这违背了将其作为 Date 的目的。
我可以将其更改为类而不是接口,但这样做是否有足够的理由?对于有很多样板的大型对象......
我可以解析服务上的响应并将其转换为日期吗?或者在拦截器中(知道怎么做吗?)?
export interface ResourceMovement {
lastMovementDate?: Date;
}
// got this from the server
const movement: ResourceMovement;
// no error on IDE, but error on browser
const time = movement.lastMovementDate.getTime();
我主要是在寻找解决这个问题的最干净和可重复使用的方法的想法和讨论!
【问题讨论】:
-
JSON 不支持日期,这就是它们以字符串形式出现的原因。您应该使用仅具有 JSON 支持的原语的数据传输对象,并在反序列化后对其进行转换。
-
接口没有被转译,因此最终的 JavaScript 对它们一无所知。如果您的日期是从 API 作为字符串(在 JSON 响应中)接收的,您必须手动将其转换为日期。一种方法是通过拦截器来遍历响应并转换所有符合日期 ISO 格式的字符串值。其他方法可能是为您的模型属性定义自定义装饰器并为此实现解析器。
-
拦截器能否猜测我期待一个带日期的接口并仅转换该特定字符串?以及您将如何处理装饰器选项,这意味着我需要使用类而不是接口,对吧?
标签: angular typescript class interface