打字稿字符串日期类型定义

时间:2021-03-31 08:01:43

标签: typescript

如何从 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
}

有没有更具体的日期字符串的方法?

2 个答案:

答案 0 :(得分:0)

type EventApiItem = {
    startDate: Date,
    endDate: Date,
    title: string
}

答案 1 :(得分:0)

是的,有一种非常具体的方法可以做到这一点。

看看my articlethis 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'

Playground