@gj-kit/format 레시피
각 코드 블록은 패키지 README에서 이미 타입 검사하는 public-contract 예제를 재사용합니다.
1. 명시적인 시간대로 timestamp 포맷하기
섹션 제목: “1. 명시적인 시간대로 timestamp 포맷하기”화면마다 다른 기본값을 상속하지 않도록 timezone과 separator를 display 호출 옆에 둡니다.
완료 상태: 호출 위치에서 시간대와 구분자가 명시된 안정적인 표시 문자열을 만듭니다.
앱 소유 경계: 코드에서 시간대와 구분자를 선택하세요. 영속·운영 값에 기기 기본값을 물려주지 마세요.
import { formatDateTime } from '@gj-kit/format';
export const dateLabel = formatDateTime(Date.UTC(2026, 7, 26, 0, 0), { timeZone: 'Asia/Seoul', separator: '-',});2. 숨은 의미 없이 금액과 byte 포맷하기
섹션 제목: “2. 숨은 의미 없이 금액과 byte 포맷하기”formatter가 정책을 추측하게 두지 말고 코드에서 통화와 0값 동작을 선택합니다.
두 @ts-expect-error 줄은 배포되는 dist/index.d.ts에 대해 strict + exactOptionalPropertyTypes로 검증한 결과입니다. fallback: null은 반환 타입을 딱 string | null 만큼만 넓힙니다.
import { formatBytes, formatDateTime, parseIsoInstant } from '@gj-kit/format';
declare const createdAt: string; // app-owned: an ISO string straight off the API
// @ts-expect-error 'GB' labels a decimal divisor, but 'binary' divides by 1024.formatBytes(1, { system: 'binary', maxUnit: 'GB', unitSpace: true, nonPositive: 'render' });
// @ts-expect-error a wall-clock string never reaches a formatter — parse it first.formatDateTime(createdAt, { timeZone: 'Asia/Seoul', separator: '-' });
const instant = parseIsoInstant(createdAt, { assumeNoOffset: 'utc' });
export const stamp: string = formatDateTime(instant, { timeZone: 'Asia/Seoul', separator: '-' });
// fallback widens the return type by exactly what you passed, and nothing more.export const sizeChip: string | null = formatBytes(0, { system: 'decimal', unitSpace: false, nonPositive: 'fallback', fallback: null,});전체 API reference에서 모든 export와 import path를 확인하세요.