如何在TypeScript中处理ISO日期字符串?

时间:2016-07-13 18:51:12

标签: typescript

我是打字稿的新手,所以我试图抓住它。

网络请求将返回带有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对象,那将会非常酷。

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

3 个答案:

答案 0 :(得分:4)

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

可以做的是,在解析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属性,如果它与日期模式不匹配,您可能会抛出错误或做任何您想做的事情。

答案 1 :(得分:0)

您可以使用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?
}

干杯。

答案 2 :(得分:0)

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