JSON → TypeScript
JSON 표본에서 TypeScript 인터페이스를 뽑습니다. 손으로 옮겨 적다 보면 꼭 한둘을 빠뜨리는데 그 실수는 런타임에서야 드러납니다. 배열 안 객체들의 모양이 서로 다르면 합치고, 한쪽에만 있던 필드에는 물음표를 붙입니다.
넣은 것은 기기를 벗어나지 않습니다. 브라우저 안에서만 처리하고 어디에도 보내거나 저장하지 않습니다.
표본 하나로 짐작하는 일입니다. 그때 마침 null 이던 필드는 null 로만 보이고, 그때 없던 선택 필드는 잡히지 않습니다. 배열 안 객체들의 모양이 다르면 합치되 한쪽에만 있던 것은 ? 를 붙입니다. 나온 것을 눈으로 한 번 훑어 주세요.
이름은 어떻게 붙나
뿌리 이름 칸에 적은 것이 첫 인터페이스가 됩니다. 안쪽 객체는 키 이름을 파스칼 표기로 바꿔 씁니다 — owner 는 Owner, shipping_address 는 ShippingAddress 입니다. 이름이 겹치는데 모양이 다르면 Owner2 처럼 숫자를 붙이고, 모양이 같으면 하나만 만들어 함께 씁니다. 뿌리가 객체가 아니라 배열이면 RootList 별칭이 하나 더 나옵니다.
타입을 짐작하는 규칙
숫자는 정수든 소수든 number 입니다. 날짜·주소는 그저 string 입니다 — JSON 에 그것을 구분하는 표기가 없기 때문입니다. 한 자리에 여러 타입이 오면 string | null 처럼 합칩니다. 빈 배열은 무엇이 들어올지 알 길이 없어 unknown[] 로 둡니다. 식별자로 쓸 수 없는 키(content-type·1st)는 따옴표로 감쌉니다.
표본 여럿을 합치는 법
응답을 하나만 넣으면 그 응답에 있던 필드만 잡힙니다. 응답 여럿을 대괄호로 묶어 배열로 넣으면 안쪽 객체들이 합쳐집니다 — 어느 하나에만 있던 필드는 ? 가 붙고, 어떤 응답에서는 null 이고 다른 데서는 값이던 필드는 string | null 이 됩니다.
자주 묻는 질문
나온 타입을 그대로 써도 되나요?
눈으로 한 번 훑어 주세요. 표본 하나로 짐작하는 일이라 한계가 분명합니다. 그때 마침 null 이던 필드는 null 로만 보이고, 그때 없던 선택 필드는 아예 잡히지 않습니다. 여러 응답을 합쳐 넣으면 조금 나아집니다.
같은 모양이 여러 번 나오면요?
인터페이스를 하나만 만들고 그것을 함께 씁니다. 같은 구조에 이름만 다른 타입이 늘어나지 않도록 한 것입니다.
`null` 은 어떻게 나오나요?
표본에 null 만 있으면 무슨 타입인지 알 길이 없어 null 로 둡니다. 실제로는 다른 값이 올 자리이므로, 값이 든 표본을 함께 넣거나 손으로 고치는 편이 낫습니다.
중첩된 객체는요?
안쪽 객체마다 따로 인터페이스를 만들고 바깥에서 그것을 가리킵니다. 배열 안 객체들의 모양이 서로 다르면 합쳐서 하나로 만들고, 한쪽에만 있던 필드에는 물음표를 붙입니다.
`type` 으로 나오게 할 수는 없나요?
없습니다. 인터페이스로만 냅니다. 필드 목록만 있는 모양이라 type 으로 바꿔도 뜻이 같으니, 팀 규칙이 type 이면 낱말만 바꿔 쓰세요.
숫자 키로 된 객체(맵)는요?
그 키를 그대로 필드로 씁니다. {"1": …, "2": …} 는 "1"·"2" 라는 필드 둘이 됩니다. 키가 값인 사전이라면 Record<string, T> 로 손으로 고치세요.
붙여넣은 코드가 서버로 가나요?
가지 않습니다. 브라우저 안에서만 처리하고 어디에도 보내거나 저장하지 않습니다. 사내 설정 파일이나 운영 쿼리처럼 밖으로 내보내기 곤란한 것도 그래서 쓸 수 있습니다. 인터넷을 끊고도 동작합니다.