MYMONDAY.ai
서비스스튜디오도구데이터·포맷73CSS 생성기19색상·이미지10인코딩·보안10웹·SEO11개발·데브옵스10파일·내보내기18계산기6가이드

CSV TypeScript 인터페이스 생성기

CSV를 붙여 넣으면 배열 타입과 한 행을 설명하는 인터페이스 또는 type 별칭이 나옵니다.

  • 브라우저에서 처리
  • 가입 없음
  • 무료

도구 작업 공간

예제

옵션

끄면 열 이름이 column_1, column_2 …가 되고 JSON은 배열이 됩니다.

비어 있거나 구분자만 있는 줄을 버려서 뒤 레코드가 밀리지 않게 합니다.

채워진 셀이 모두 맞을 때만 열이 숫자·불리언이 됩니다. 01234나 20자리 ID는 텍스트로 남습니다. 끄면 모든 셀이 적은 그대로 텍스트입니다.

대소문자 구분 없이 쉼표로 구분합니다. 빈 셀은 항상 null입니다.

선언 방식
알 수 없는 값

CSV 입력

6줄181byte구분자: 쉼표 (자동 감지)

결과

⌘/Ctrl + Enter로 복사
결과 · CsvRow.ts
export type CsvRow = CsvRowItem[];

export interface CsvRowItem {
  id: number;
  customer: string;
  total: number;
  paid: boolean;
  note: string | null;
  shipped: string | null;
}
행3
열6
타입1
크기185byte

파일을 읽은 결과

변환기가 보는 앞쪽 레코드와 열마다 정해진 타입입니다.

줄id숫자customer텍스트total숫자paid불리언note텍스트shipped텍스트
21001Ada Lovelace87.90trueGift wrap, please2026-03-14
31002Grace Hopper19falseNA2026-03-15
41003Linus1200.5trueLine one line two·

이 CSV TypeScript 생성기는 CSV나 TSV의 헤더와 값을 읽어 한 행에 대한 선언과 파일 전체에 대한 배열 타입, 예를 들어 export type CsvRow = CsvRowItem[];와 export interface CsvRowItem을 만듭니다. 스프레드시트를 TypeScript 프로젝트로 가져오면서 Papa Parse나 csv-parse로 파싱할 때, 결과에 붙일 타입이 필요한 경우에 씁니다.

타입은 첫 행이나 마지막 행이 아니라 모든 행을 보고 정합니다. 채워진 셀이 모두 숫자나 불리언일 때만 number, boolean이 되고, 빈 셀이나 null 단어가 있는 열에는 | null이 붙으며, 앞자리 0이 있는 식별자는 string으로 남습니다. 감지를 끄면 모든 속성이 string인데, 동적 타이핑 없이 CSV 파서가 돌려주는 값이 바로 이것입니다.

CSV는 브라우저 안에서 처리되며 서버로 전송되지 않습니다. 한도는 입력 20 MiB, 데이터 행 50,000개, 열 200개이고, 다운로드 파일 이름은 CsvRow.ts처럼 루트 타입 이름을 따릅니다.

사용 방법

  1. CSV 불러오기

    행을 붙여 넣거나 .csv, .tsv 파일을 엽니다. 헤더 행이 속성 이름이 되며, "첫 행은 헤더"를 끄면 column_1, column_2 식으로 이름이 붙습니다.

  2. 루트 타입 이름 정하기

    루트 타입 이름의 기본값은 CsvRow입니다. 배열 타입이 이 이름을 쓰고 행 타입은 단수형을 씁니다. CsvRow는 CsvRowItem, Products는 Product가 됩니다.

  3. 선언 방식 고르기

    "선언 방식"에서 interface와 type 별칭 중 하나를 고릅니다. 모듈 안에서만 쓸 타입이면 "export 키워드"를 끄고, 모든 필드에 readonly를 붙이려면 "readonly 속성"을 켭니다.

  4. 감지 여부 결정

    number, boolean, | null이 필요하면 "숫자·불리언·null 감지"를 켜 두고, 모든 열을 string으로 두려면 끕니다. "파일을 읽은 결과" 패널에서 열마다 정해진 타입을 볼 수 있습니다.

  5. 프로젝트에 복사

    선언을 복사하거나 .ts 파일로 내려받은 뒤, 아래의 파서 주의점을 확인하고 Papa.parse<CsvRowItem>(text, { header: true, dynamicTyping: true })처럼 파서 결과에 행 타입을 붙입니다.

작동 원리

헤더에서 선언으로

변환기는 CSV를 읽어 열 단위로 값의 타입을 정하고, 행에 대한 선언 하나와 루트 이름을 딴 배열 타입을 출력합니다. 유효한 식별자인 속성 이름은 그대로 쓰며, TypeScript가 속성 이름으로 허용하는 class나 default 같은 단어도 마찬가지입니다. first name, user-id, 1st place 같은 이름은 "first name": string;처럼 따옴표 키가 됩니다.

루트 이름은 파스칼 케이스로 바뀌어 order line은 OrderLine, 행 타입은 OrderLineItem이 됩니다. 숫자로 시작하는 이름에는 Type 접두사가 붙어 2024 sales는 Type2024Sales와 Type2024Sale이 됩니다.

export type CsvRow = CsvRowItem[];

export interface CsvRowItem {
  id: number;
  name: string;
  active: boolean;
}

모든 행을 합쳐 정하는 타입

각 속성의 타입은 감지를 거친 뒤 그 열에 있는 모든 값을 아우릅니다. 감지 단계에서 열마다 종류가 하나로 정해지므로, 결과는 기본 타입 하나(string, number, boolean)에 빈 셀이나 NA 같은 null 단어가 하나라도 있으면 | null이 붙는 형태입니다. 정수와 소수는 모두 number입니다.

?로 표시되는 선택 속성은 없습니다. 모든 레코드에 모든 열이 있으므로 키가 빠지는 일은 없고 null이 될 뿐입니다. 모든 행에서 비어 있는 열은 null 타입 하나가 됩니다. 모든 열이 구체적인 타입으로 정해지므로 "알 수 없는 값" 설정은 CSV 입력에 영향을 주지 않습니다.

열의 값감지 끔감지 켬
Ari, Beastringstring
1, 2stringnumber
10, 12.5stringnumber
true, FALSEstringboolean
9.5, (빈 셀)stringnumber | null
Ari, (빈 셀)stringstring | null
02134, 10001stringstring
1, xstringstring
(빈 셀), NAstringnull

선언 옵션

"선언 방식"은 interface CsvRowItem { … }과 type CsvRowItem = { … }; 사이를 전환합니다. 인터페이스는 확장과 병합이 되고, type 별칭은 나중에 행 타입을 다른 타입과 교차하거나 키를 매핑할 때 더 잘 맞습니다. 배열 타입은 항상 type 별칭입니다.

"export 키워드"는 두 선언 모두에서 export를 넣거나 빼고, "readonly 속성"은 모든 필드 앞에 readonly를 붙입니다. 파싱한 뒤 고치지 않는 행에 알맞습니다.

실제 예시

기본 설정
입력
id,name,active
1,Ari,true
2,Bea,false
출력
export type CsvRow = CsvRowItem[];

export interface CsvRowItem {
  id: number;
  name: string;
  active: boolean;
}

루트 타입 이름 CsvRow, interface, export 키워드 켬입니다.

빈 셀과 섞인 숫자
입력
id,price,note
1,10,
2,12.5,gift
3,9,NA
출력
export type CsvRow = CsvRowItem[];

export interface CsvRowItem {
  id: number;
  price: number;
  note: string | null;
}

price에는 10, 12.5, 9가 섞여 있어 number입니다. note에는 빈 셀과 NA가 있어 string | null입니다.

type 별칭, readonly, export 없음, 따옴표 이름
입력
id,first name,user-id
1,Ari,u-1
2,Bea,u-2
출력
type UserRow = UserRowItem[];

type UserRowItem = {
  readonly id: number;
  readonly "first name": string;
  readonly "user-id": string;
};

루트 타입 이름 user row, "선언 방식"은 type 별칭, "export 키워드" 끔, "readonly 속성" 켬입니다.

감지를 끈 경우
입력
id,name,active
1,Ari,true
출력
export type CsvRow = CsvRowItem[];

export interface CsvRowItem {
  id: string;
  name: string;
  active: string;
}

모든 속성이 string입니다. 타입 변환 없이 Papa Parse나 csv-parse가 돌려주는 결과와 일치합니다.

우편번호는 string으로 유지
입력
zip,qty
02134,1
10001,2
출력
export type CsvRow = CsvRowItem[];

export interface CsvRowItem {
  zip: string;
  qty: number;
}

02134는 숫자가 되면 앞자리 0을 잃으므로 zip은 string으로 남고, 결과 아래 안내 문구가 그 열을 알려 줍니다. qty는 number입니다.

자주 하는 실수

  • 파서가 같은 타입을 만들어야 함

    Papa Parse는 dynamicTyping을 켜지 않으면 문자열을 돌려주고, 켜더라도 셀마다 따로 변환하므로 이 도구가 string으로 정한 열에서도 02134를 숫자 2134로 바꾸며, null 단어 목록도 없습니다. csv-parse는 cast를 켜야 숫자가 나옵니다. 파서 옵션이나 변환 단계를 생성된 타입에 맞추세요.

  • 모든 행에서 비어 있는 열

    이런 열은 null 타입이 되어 실제 값은 하나도 들어갈 수 없습니다. 샘플에서 그 열에 채워진 셀을 하나 이상 넣거나 속성을 직접 string | null로 넓히세요.

  • 엉뚱한 값 하나가 열을 string으로 만듦

    3, 5, ask가 든 qty 열은 number | string이 아니라 string이 됩니다. 감지는 한 열 안에서 종류를 섞지 않기 때문입니다. 그 값을 정리하거나 "null로 볼 단어"에 추가하면 number로 돌아옵니다.

  • 날짜 타입 없음

    날짜 감지가 없으므로 날짜 열도 string입니다. 코드에서 변환한다면 타입을 Date로 바꾸세요.

  • 속성 이름이 카멜 케이스로 바뀌지 않음

    헤더는 앞뒤 공백만 제거하고 쓰인 그대로 유지되므로 first_name은 first_name으로 남고 user-id는 따옴표 키가 됩니다. 코드 스타일상 카멜 케이스가 필요하면 CSV나 에디터에서 이름을 바꾸세요.

자주 묻는 질문

인터페이스를 만드나요, 타입 별칭을 만드나요?

둘 다 됩니다. 행은 기본적으로 인터페이스이고, "선언 방식"을 type 별칭으로 바꾸면 type 별칭이 됩니다. 목록은 항상 export type CsvRow = CsvRowItem[]; 같은 type 별칭입니다.

빈 셀이 선택 속성이 되나요?

아니요. 모든 행에 키가 있으므로 note: string | null;처럼 null 허용 속성이 됩니다. 파서가 빈 키를 빼 버리는 경우에만 ?를 직접 붙이세요.

공백이나 하이픈이 든 헤더는 어떻게 처리되나요?

"first name": string;, "user-id": string;처럼 따옴표 속성 이름으로 쓰입니다. 코드에서는 row["first name"]처럼 대괄호 표기로 접근하세요.

다른 숫자는 number인데 우편번호 열은 왜 string인가요?

열 안의 모든 값이 손실 없이 바뀔 때만 number가 됩니다. 02134는 앞자리 0 때문에 2134로 돌아오게 되므로 열은 string으로 남고, 결과 아래 안내 문구가 그 열을 알려 줍니다.

행 타입 이름은 무엇인가요?

루트 이름의 단수형입니다. CsvRow는 복수형 어미가 없어 행 타입이 CsvRowItem이 되고, Products는 Product, Categories는 Category가 됩니다.

CSV가 업로드되나요?

아니요. CSV와 생성된 선언은 브라우저 안에서 처리되며 서버로 전송되지 않으므로, 비공개 데이터셋의 샘플로도 내 컴퓨터 밖으로 보내지 않고 타입을 만들 수 있습니다.

마지막 업데이트: