【问题标题】:How to handle ISO date strings in TypeScript?如何在 TypeScript 中处理 ISO 日期字符串?
【发布时间】:2016-07-13 18:51:11
【问题描述】:

我是打字稿的新手,所以我正在努力掌握它。

网络请求将返回一个带有 ISO 日期字符串格式字段的 JSON 对象。

data : Data = {when: "2016-07-13T18:46:01.933Z"}

当我为这个接口创建类型签名时,有没有办法指定这实际上是一个 ISO 时间戳,还是我只需要使用字符串?

interface Data {
  when: string
}

我发现我可以使用类型别名,这在心理上有帮助,但并不能真正验证 ISO 字符串。

type iso = string
interface Data {
  when: iso
}

在类似的情况下,我很好奇是否可以从这些打字稿注释生成 js 验证,以便我可以验证端点接收到的信息,否则我的打字应用程序的其余部分一文不值。

如果这是可能的,那么如果这个 iso 字符串可以被强制转换成一个实际的 Date 对象,那就太棒了。

正如我所说,我是 typescript 的新手,所以我不确定这是否超出了 typescript 应该做的范围。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    不,这是不可能的。对于 javascript,与 typescript 的接口无关。 (根本不为接口生成JS)。此外,所有类型检查都是在“编译”或“转译”时完成的,而不是在运行时。

    可以做的是在解析json时使用reviver函数。例如:

    const datePattern = /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/;
    const json = '{"when": "2016-07-13T18:46:01.933Z"}';
    
    const result = JSON.parse(json, (key: any, value: any) => {
        const isDate = typeof value === 'string' && datePattern.exec(value);
        return isDate? new Date(value) : value;
    });
    

    您还可以通过键识别Date 属性,如果它与日期模式不匹配,您可能会抛出错误或做任何您想做的事情。

    【讨论】:

      【解决方案2】:

      您可以使用Type Guard

      import moment from 'moment'
      
      export const isISO = (input: any): input is tISO =>
        moment(input, moment.ISO_8601, true).isValid()
      

      然后您可以使用您想要处理任何错误日期的任何自定义逻辑,例如:

      const maybeISO = fetch('Maybe ISO')
      
      if (isISO(maybeISO)) {
        // proceed
      } else {
        // check other format?
        // log error?
      }
      

      干杯。

      【讨论】:

        【解决方案3】:

        您可以从io-ts-types 使用DateFromISOString 看到它是documentation

        【讨论】:

        • 感谢@RasmusGP 的提示。作者移动文档后我刚刚更新了链接
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-07
        • 1970-01-01
        相关资源
        最近更新 更多