【问题标题】:Best approach to handle dates on typescript interfaces from server从服务器处理打字稿接口日期的最佳方法
【发布时间】: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


【解决方案1】:

可以考虑几种方法。

最常见的是依赖时间戳。时间戳是从 1970 年 1 月 1 日 GMT+0 开始的数字,以 MS 为单位。我知道的任何语言都可以读取时间戳。

第二种方法是使用特定的字符串,例如 UTC 日期或 ISO 日期。这些是大多数语言(如果不是全部)都可以阅读的公认格式。它们包含时区,与时间戳相反。

使用的解决方案很大程度上取决于您的需要:如果您需要由服务器设置日期,那么时间戳就是要走的路。但是,如果您希望您的用户根据他们的语言环境设置日期,那么您将需要使用字符串。

现在,要将您的日期转换为所需的格式,我会亲自在专用工具/服务中使用映射器。

拦截器的问题是您无法真正知道哪个字段是日期,因为它们不是日期的实例,而是字符串/数字。

您可能可以使用带有自定义标头的拦截器来确定要转换的字段,但这是使用 MOAB 杀死蟑螂...

【讨论】:

  • 是的,我们正在使用 ISO 日期,而且工作正常。我的问题是我将类型定义为日期,然后每当我访问它时,我都需要在其上调用 new Date()。我同意自定义标头是 MOAB,但希望 javascript 或 typescript 可以有一个很好的解决方案来识别我正在接收该接口并将该值转换为日期,在每个请求中。
  • @talkshowhost 接口无法确定,但类肯定可以。 Class-Transformer 对此非常有帮助!
  • 很有趣,不知道这个库,会研究一下!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
相关资源
最近更新 更多