문서 작업 가이드
API JSON 응답에서 TypeScript 타입 생성하기
API JSON 샘플에서 TypeScript 인터페이스를 만들고 선택 필드, 혼합 배열, null, 숫자 정밀도, 특이한 키, 런타임 검증까지 점검합니다.
작성 및 검수 SimpleWebUtils게시일: 검토일:
이 작업 흐름을 검증한 방법
“사용자 레코드 두 개를 하나의 응답 구조로 병합” 문서 입력을 JSON → TypeScript 변환기에 그대로 넣었습니다. 수행 순서는 “원본을 엄격한 JSON으로 검증합니다”, “여러 대표 레코드에서 타입을 생성합니다”였고 브라우저 결과를 예시 출력과 대조했습니다. 실패 경계는 “운영 비밀값을 편리한 샘플로 사용하기”, “객체 하나에서 선택 필드를 추론하기” 두 항목으로 나눠 검토했습니다.
샘플 두 개는 필수 id와 선택 name·active를 가진 하나의 users 원소 interface로 합쳐졌으며, 첫 객체만 전체 schema로 오해하지 않았습니다.
문제 상황
복사한 API 응답은 TypeScript 선언 초안을 빠르게 만들 수 있지만 샘플 기반 추론에는 빈틈이 있습니다. 레코드 하나만으로 선택 필드를 증명할 수 없고, 빈 배열에서는 요소 타입을 알 수 없으며, null은 다른 응답에서만 나타날 수 있습니다. 긴 숫자 식별자는 이미 JavaScript의 정확한 정수 범위를 넘었을 수도 있습니다. 따라서 생성 결과는 공식 스키마나 런타임 검증기가 아니라 검토 가능한 초안입니다.
이럴 때 사용하세요
- 새 REST 엔드포인트의 JSON 응답에 맞는 클라이언트 타입 초안이 필요할 때
- Webhook 또는 외부 SDK 예시를 연동 전에 구조화해 설명해야 할 때
- 여러 픽스처 레코드를 합쳐 누락되거나 충돌하는 필드를 찾을 때
- 버그 보고서의 낯선 페이로드를 읽기 쉬운 구조로 요약해야 할 때
단계
- 1단계
응답에서 민감정보를 제거하고 범위를 줄입니다
필요한 구조를 유지하는 가장 작은 대표 페이로드만 복사하세요. 액세스 토큰, 쿠키, 이메일, 계정 식별자와 무관한 레코드는 제거합니다. 배열 항목마다 필드가 다르다면 선택 여부를 확인할 수 있도록 최소 두 항목을 남깁니다.
- 2단계
원본을 엄격한 JSON으로 검증합니다
추론 전에 JSON Validator 또는 JSON Formatter로 샘플을 확인하세요. 주석, 마지막 쉼표, 잘못된 이스케이프, 여러 루트, 중복 키를 명시적으로 고칩니다. 중복 키는 파서마다 남기는 값이 달라질 수 있어 모호합니다.
- 3단계
안정적인 루트 이름과 선언 방식을 고릅니다
ApiResponse, OrderList, WebhookEvent처럼 도메인을 나타내는 PascalCase 이름을 사용하세요. 객체 확장이나 선언 병합이 코드베이스와 맞으면 interface를, 별칭이 팀 규칙이면 type을 고릅니다. 배열과 스칼라 루트는 타입 별칭이 필요합니다.
- 4단계
여러 대표 레코드에서 타입을 생성합니다
같은 배열의 객체들이 의도적으로 누락 필드를 보여 준다면 선택 속성 추론을 켭니다. 생성기는 객체 샘플을 병합하고, TypeScript 식별자가 아닌 키를 따옴표로 보존하며, 중첩 선언을 만들고, JSON 값 종류가 다르면 유니온을 사용합니다.
- 5단계
모든 추론 경고를 검토합니다
실제 요소 타입을 확인한 뒤에만 Array<unknown>을 바꾸세요. 빈 객체 선언, 혼합 배열 유니온, null 멤버, 숫자 정밀도 경고를 확인합니다. 날짜 문자열은 string이고 모든 JSON 숫자는 number이며, 샘플에 없는 변형은 발견할 수 없습니다.
- 6단계
대상 프로젝트에서 컴파일하고 경계를 검증합니다
생성 파일을 프로젝트에 추가해 TypeScript 컴파일러와 린트 규칙을 실행하세요. API 문서, OpenAPI, JSON Schema 또는 GraphQL 계약과 선언을 비교합니다. 외부 응답은 생성 타입으로 단정하기 전에 런타임에서 검증합니다.
예시
사용자 레코드 두 개를 하나의 응답 구조로 병합
입력
{
"users": [
{ "id": "usr_1", "name": "Ada" },
{ "id": "usr_2", "active": true }
]
}출력
export interface ApiResponse {
users: Array<ApiResponseUsersItem>;
}
export interface ApiResponseUsersItem {
id: string;
name?: string;
active?: boolean;
}흔한 실수
운영 비밀값을 편리한 샘플로 사용하기
로컬 처리는 네트워크 노출을 줄이지만 불필요한 작업 사본에 비밀값과 개인정보를 넣을 이유는 없습니다. 먼저 제거하고 구조에 필요한 값만 남기세요.
객체 하나에서 선택 필드를 추론하기
객체 하나는 그 응답에 우연히 존재한 필드만 보여 줍니다. 여러 대표 항목이나 공식 스키마를 확인한 뒤 선택 표시를 추가하거나 제거하세요.
unknown을 추측한 타입으로 바꾸기
빈 배열에는 요소 타입의 근거가 없습니다. 근거 없이 string[]이나 object[]로 바꾸면 실제 응답이 올 때까지 계약 오류가 숨을 수 있습니다.
정확해야 하는 숫자 식별자를 무시하기
TypeScript number는 JavaScript 숫자 규칙을 따릅니다. 긴 계정 ID, 주문 번호, 정확한 소수는 숫자보다 문자열로 받아야 하는 경우가 많습니다.
런타임 검증을 생략하기
정적 타입은 실행 시 사라집니다. 서버는 누락되거나 추가되거나 다른 타입의 값을 보낼 수 있으므로 애플리케이션이 신뢰하기 전에 외부 입력을 검증하세요.
자주 묻는 질문
API 응답 하나로 완전한 TypeScript 계약을 만들 수 있나요?
아니요. 유용한 초안은 만들 수 있지만 선택 필드와 모든 변형은 문서, 스키마 또는 충분히 대표적인 응답 모음으로만 확인할 수 있습니다.
빈 배열이 왜 Array<unknown>이 되나요?
추론할 요소 값이 없기 때문입니다. unknown은 불확실성을 숨기지 않고 안전하지 않은 속성 접근을 막으며, 실제 계약을 확인한 뒤 구체적인 타입으로 바꿀 수 있습니다.
null을 허용하는 필드는 선택 속성이어야 하나요?
자동으로 같아지지 않습니다. null은 필드가 존재하지만 값이 없다는 뜻이고, 선택 속성은 필드 자체가 없을 수 있다는 뜻입니다. 올바른 조합은 API 계약에 달려 있습니다.
일부 속성명에 왜 따옴표가 붙나요?
JSON은 공백, 하이픈, 숫자로 시작하는 이름, 줄바꿈 등 TypeScript가 단독 식별자로 쓸 수 없는 키를 허용합니다. 따옴표는 정확한 키와 유효한 문법을 함께 보존합니다.
Zod, JSON Schema 같은 검증기가 여전히 필요한가요?
신뢰할 수 없는 데이터가 애플리케이션으로 들어올 때는 런타임 검증을 사용하세요. 생성된 TypeScript 선언은 편집기와 컴파일러 검사를 돕지만 실제 응답을 검사할 수 없습니다.