요일 - 날짜 - 월 종류

잘 알려진 필드 외에도 요일, 날짜 및 월의 이름을 따서 이름이 지정되고 특정 날짜와 관련된 일부 값을 포함하는 여러 필드가 있는 객체를 갑자기 처리한다고 가정합니다. 즉. 순수한 Typescript 대신 Javascript를 몇 번이나 사용했는지 기록을 유지한다고 가정해 보겠습니다.

최종 코드를 사용할 수 있습니다in the playground.

const howHappyToUseTypescriptHistory = {
    Thu29Jul: Infinity,
    overall: Infinity
}


지금까지는 유형이 유추되었지만 금요일에는 어떻게 될까요? 다른 레코드를 추가하고 평균을 다시 계산해야 하며 유추된 유형 변경이 필요합니다. 그러한 구성을 입력하는 방법이 전혀 있습니까?

알고 보니 있습니다. Typescript v4는 이를 수행할 수 있는 강력한 기능을 제공합니다.

평일 유형을 만드는 것부터 시작하겠습니다.

type DaysOfTheWeek = 'Mon' | 'Tue' | 'Wen' | 'Thu' | 'Fri' | 'Sat' | 'Sun';


이제 남은 일수에 따라 월을 입력합니다(2월 생략).

type ThirtyOneDaysMonths = 'Jan' | 'Mar' | 'May' | 'Jul' | 'Aug' | 'Oct' | 'Dec';
type ThirtyDaysMonths = 'Apr' | 'Jun' | 'Sep' | 'Nov';


모든 달은 29-30-31일을 가질 수 있으므로 Typescript 의 템플릿 리터럴을 사용하는 3가지 유형 세트입니다.

type OneThroughNine = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
type OneThroughTwentyNine = `${0 | 1 | 2}${OneThroughNine}`;
type OneThroughThirty = OneThroughTwentyNine | '30';
type OneThroughThirtyOne = OneThroughThirty | "31";


이 시점에서 아마도 이제 일반 문자열을 사용하여 이러한 모든 문자열을 DayDateMonth 형식으로 함께 붙일 것이라고 추측했을 것입니다.

type DayOfWeekDateMonth<DaysInMonth extends string, Months extends string> = `${DaysOfTheWeek}${DaysInMonth}${Months}`;
type DayDateMonth = DayOfWeekDateMonth<OneThroughTwentyNine, 'Feb'> | DayOfWeekDateMonth<OneThroughThirty, ThirtyDaysMonths> | DayOfWeekDateMonth<OneThroughThirtyOne, ThirtyOneDaysMonths>;


문자열에 대한 유형이 준비되면 다른 날짜의 데이터를 저장할 일반 레코드를 정의할 수 있습니다.

type DayDateMonthRecord<T> = {
    [key in DayDateMonth]?: T;
};


매핑된 유형은 자체 속성이나 메서드를 선언하지 않을 수 있으므로 average 또는 다른 필드를 추가하려면 확장DayDateMonthRecord<T>이 필요합니다.

interface ListWithAverage<T> extends DayDateMonthRecord<T> {
  average: number;
}


마지막으로 초기 개체를 입력할 수 있습니다.

const howHappyToUseTypescriptHistory: ListWithAverage<number> = {
    Thu29Jul: Infinity,
    overall: Infinity
}


이제 필요한 경우 intellisense를 사용하여 엄격한 타이핑을 수행할 수 있습니다. :)

좋은 웹페이지 즐겨찾기