我是打字稿的新手,所以我试图抓住它。
网络请求将返回带有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对象,那将会非常酷。
正如我所说,我是打字稿的新手,所以我不确定这是否超出了打字稿应该做的范围。
答案 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。