如何从 json api 中输入日期字符串?
我想为我的 api 响应创建类型。这是我的 api json 响应
{
"startDate": "2021-10-02T00:00:00Z",
"endDate": "2021-10-02T23:59:00Z",
"title": "My first event",
"id": 1
}
实际上我是这样定义类型的:
type EventApiItem = {
startDate: string,
endDate: string,
title: string
}
我就这样使用我的字体
var eventItem: EventApiItem = {
startDate: response.startDate,
endDate: response.startDate,
title: response.title
}
有没有更具体的日期字符串的方法?
答案 0 :(得分:0)
type EventApiItem = {
startDate: Date,
endDate: Date,
title: string
}
答案 1 :(得分:0)
是的,有一种非常具体的方法可以做到这一点。
看看my article和this closed question
type PrependNextNum<A extends Array<unknown>> = A["length"] extends infer T
? ((t: T, ...a: A) => void) extends (...x: infer X) => void
? X
: never
: never;
type EnumerateInternal<A extends Array<unknown>, N extends number> = {
0: A;
1: EnumerateInternal<PrependNextNum<A>, N>;
}[N extends A["length"] ? 0 : 1];
type Enumerate<N extends number> = EnumerateInternal<[], N> extends (infer E)[]
? E
: never;
type ZeroRequired = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
type AddZero<T extends number> = T extends ZeroRequired ? `${0}${T}` : T;
type AddSt<T extends NumberString<number>> = `${T}st`;
type MakeString<T extends number | string> = `${T}`;
type Month = MakeString<AddZero<Exclude<Enumerate<13>, 0>>>;
type Day = MakeString<AddZero<Exclude<Enumerate<32>, 0>>>;
type Months = 'January' | 'February' | 'March';
type NumberString<T extends number> = `${T}`;
type Year = `${NumberString<number>}${NumberString<number>}${NumberString<number>}${NumberString<number>}`;
type DataKey = `${Year}-${Month}-${Day}`;
type GetDay<T extends DataKey> = T extends `${string}-${Month}-${infer D}` ? D : `${number}`;
type GetMonth<T extends DataKey> = T extends `${string}-${infer M}-${Day}` ? M : `${number}`;
type MapMonth<T extends NumberString<number>> =
T extends '01'
? 'January' : T extends '02'
? 'February' : T extends '03'
? 'March' : never;
type ConvertToMonth<T extends DataKey> = MapMonth<GetMonth<T>>;
type RemoveLeadZero<T extends GetDay<DataKey>> = T extends `0${infer N}` ? N : T
type MakeDate<T extends DataKey> = `${AddSt<RemoveLeadZero<GetDay<T>>>} ${ConvertToMonth<T>}`
type Base = Record<DataKey, { date: MakeDate<DataKey>, value: number }>
const data = {
'2021-03-01': {
"date": "1st March",
"value": 17,
},
'2021-03-02': {
"date": '2st March',
"value": 19,
},
} as const;
type Data = typeof data
type Values<T> = T[keyof T]
// should be allowed to proceed
type Test = Values<keyof Data extends DataKey ? {
[P in keyof Data]: P extends DataKey ? Data[P]['date'] extends MakeDate<P> ? true : false : false
} : false> extends true ? 'allowed' : 'disallowed'