JSON을 io-ts 타입으로 변환 — Numio
JSON 샘플로 import * as t from "io-ts"로 시작하는 io-ts 런타임 코덱을 생성합니다. 중첩 객체는 각각 코덱이 되어 이를 사용하는 코덱보다 먼저 선언되며, 배열의 일부 항목에만 있는 키는 t.partial에 들어갑니다.
fp-ts와 io-ts 기반 TypeScript 앱에서 API 응답을 런타임에 검증합니다.
JSON
IO TS
이럴 때 사용하세요
- fp-ts와 io-ts 기반 TypeScript 앱에서 API 응답을 런타임에 검증합니다.
- 사용 전에 검사해야 하는 JSON 설정 파일용 코덱 초안을 만듭니다.
사용 방법
- JSON 객체를 붙여 넣습니다. 선택적 키가 있다면 배열 항목을 여러 개 포함하세요.
- 생성된 코덱을 확인합니다. 루트는 RootInterface이고 중첩 코덱은 키 이름을 따릅니다(settings는 Settings가 됨).
- 코드를 복사해 필요한 코덱을 export하고 t.TypeOf로 타입을 도출합니다.
JSON 입력
{
"id": "u_1",
"name": "Ada",
"age": 36,
"nickname": null,
"settings": { "theme": "dark", "fontSize": 14 },
"posts": [
{ "title": "Notes", "draft": true },
{ "title": "Engine" }
]
}io-ts 코덱
import * as t from "io-ts"
const Settings = t.type({
theme: t.string,
fontSize: t.number,
})
const Posts = t.intersection([
t.type({
title: t.string,
}),
t.partial({
draft: t.boolean,
}),
])
const RootInterface = t.type({
id: t.string,
name: t.string,
age: t.number,
nickname: t.null,
settings: Settings,
posts: t.array(Posts),
})세부 정보 및 제한 사항
사이트 자체 생성기로 브라우저에서 생성되고 Prettier로 정리됩니다. 설정이 없고 서버 요청도 없습니다.
코덱은 의존 대상부터 출력되므로 모든 const가 RootInterface에서 참조되기 전에 정의됩니다.
숫자는 정수와 소수 모두 t.number가 됩니다. null은 t.null, 다른 샘플에 값이 있으면 t.union([X, t.null])이 되고, 빈 배열은 t.array(t.unknown)이 됩니다.
배열의 일부 항목에만 있는 키는 t.partial에 들어가고 t.intersection으로 필수 키와 결합됩니다.
FAQ
TypeScript 타입도 만들어지나요?
직접 만들지는 않습니다. type Root = t.TypeOf<typeof RootInterface>를 추가하면 각 코덱에서 정적 타입을 도출할 수 있습니다.
선택적 필드나 nullable 필드는 어떻게 처리되나요?
배열의 일부 항목에만 있는 키는 t.partial에 들어가고, 일부 항목에서 null인 키는 t.union([type, t.null])이 됩니다. 단일 객체의 최상위 키는 항상 필수입니다.
루트가 JSON 배열이면 어떻게 되나요?
항목이 항목 구조를 나타내는 하나의 RootInterface 코덱으로 병합되고, 배열 전체를 위한 const RootInterfaceList = t.array(RootInterface)가 추가됩니다.