首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型记录字符串日期类型定义

类型记录字符串日期类型定义
EN

Stack Overflow用户
提问于 2021-03-31 08:01:43
回答 2查看 70关注 0票数 0

如何从json中键入日期字符串?

我想为我的api响应创建类型。这是我的api json响应

代码语言:javascript
复制
{
    "startDate": "2021-10-02T00:00:00Z",
    "endDate": "2021-10-02T23:59:00Z",
    "title": "My first event",
    "id": 1
}

实际上,我是这样定义类型的:

代码语言:javascript
复制
type EventApiItem = {
    startDate: string,
    endDate: string,
    title: string
}

我就像那样用我的类型

代码语言:javascript
复制
var eventItem: EventApiItem = {
   startDate: response.startDate,
   endDate: response.startDate,
   title: response.title
}

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

EN

回答 2

Stack Overflow用户

发布于 2021-03-31 08:06:49

代码语言:javascript
复制
type EventApiItem = {
    startDate: Date,
    endDate: Date,
    title: string
}
票数 0
EN

Stack Overflow用户

发布于 2021-03-31 08:12:07

是的,有一种非常具体的方法。

看一看我的文章这个封闭的问题

代码语言:javascript
复制
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'

游乐场

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66883907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档