문제의 역사:
JavaScript에서 Date 객체는 날짜와 시간을 나타내는 데 사용되며, 변형 가능성, 파싱의 복잡성 및 시간대의 특성으로 인해 잘 알려져 있습니다. TypeScript는 Date를 위한 표준 JS 유형을 사용하지만, 엄격한 코드에서 날짜 작업에 대한 유형화는 특별한 접근 방식이 필요합니다.
문제:
JavaScript의 Date는 변형 가능한 객체로, 비정형 오류를 생성할 수 있습니다(예: setMonth()는 자신을 변형시키므로 코드가 예기치 않게 동작할 수 있습니다). 또한, 외부 라이브러리(moment.js, date-fns, Day.js 등)와의 통합에는 정확한 유형 준수가 필요합니다. 예를 들어, moment.Instant 또는 호환되지 않는 특정 시간 래퍼와 같은 경우입니다. 경우에 따라 반환된 유형이 string 또는 number(타임스탬프)일 수 있어, 유형 주석이나 API 사용 시 오류가 발생할 수 있습니다.
해결책:
TypeScript는 새로운 Date 인스턴스를 Date로 유형화하며, 모든 메소드가 사용 가능합니다. 다른 라이브러리와 통합할 때는 입력 및 출력 값의 유형을 면밀히 살펴봐야 합니다. Date로 명시적으로 변환하거나(예: new Date(value)), 날짜 및 시간에 대한 사용자 정의 컨테이너 유형을 생성해야 합니다. 타임스탬프(number), 문자열 및 Date 객체 간 변환 시, 유형을 엄격하게 지정하고 함수에 대해 유형 또는 인터페이스를 설명해야 합니다.
코드 예:
function toIsoString(d: Date | number | string): string { if (d instanceof Date) return d.toISOString(); if (typeof d === 'number' || typeof d === 'string') return new Date(d).toISOString(); throw new Error('유효하지 않은 날짜'); }
주요 특징:
TypeScript에서 "Date" 타입은 단순한 value type입니까?
아니요, Date는 객체이므로 reference type입니다. 날짜를 == 또는 ===로 비교하면 값이 아니라 레퍼런스만 비교합니다.
const d1 = new Date('2022-01-01'); const d2 = new Date('2022-01-01'); d1 === d2; // false
문자열이나 숫자를 Date 타입에 직접 할당할 수 있습니까?
아니요, Date 타입은 number 또는 string과 호환되지 않습니다. 새로운 인스턴스를 생성해야 합니다: new Date(value).
const d: Date = new Date('2020-01-01'); // const d2: Date = '2020-01-01'; // 유형 오류
Date를 받는 함수는 외부 라이브러리의 객체(moment, dayjs)와 함께 작동합니까?
아니요, unless 외부 라이브러리에서 명시적으로 Date와의 변환/호환성을 구현하지 않는 한, 이것들은 다른 타입이며 TypeScript는 이를 Date로 인식하지 않습니다.
import dayjs from "dayjs"; function doSomething(d: Date) { /* ... */ } doSomething(dayjs()); // 오류, Dayjs 타입이 Date와 호환되지 않음
코드에서 인수를 any로 받았고, 이후 Date로 가정했습니다. 실제로 API가 string으로 타임스탬프를 반환하여 .getFullYear() 호출 시 오류가 발생했습니다.
장점:
단점:
개발자가 매개변수에 대해 명시적인 유형(Date | string | number)을 만들고, 유형 가드를 도입했으며, 함수는 명시적으로 new Date를 호출했습니다. 컴파일러가 모든 유형을 명시적으로 처리하도록 강제합니다.
장점:
단점: