type ParseObject<T extends string> = ???
type Result = ParseObject<'{ a: string; b: number; }'>;
// 기대 결과: { a: string } & { b: number }
ExtractInnerText<T>우선 문자열에서 {} 안쪽만 추출하자.
type ExtractInnerText<T extends string> =
T extends `{${infer Inner}}` ? Inner : never;
type T1 = ExtractInnerText<'{ a: string; b: number; }'>;
// " a: string; b: number; "
SplitBySemicolon<T>type Trim<T extends string> =
T extends ` ${infer R}` ? Trim<R> :
T extends `${infer R} ` ? Trim<R> :
T;
Trim<' hello '>
→ Trim<' hello '> // 앞 공백 제거
→ Trim<'hello '> // 앞 공백 또 제거
→ Trim<'hello '> // 뒤 공백 제거
→ Trim<'hello'> // 더 이상 앞뒤 공백 없음
→ T 반환 → 'hello'
type SplitBySemicolon<T extends string> =
T extends `${infer Head};${infer Tail}`
? [Trim<Head>, ...SplitBySemicolon<Tail>]
: T extends '' ? [] : [Trim<T>];
type T2 = SplitBySemicolon<'a: string; b: number;'>;
// ['a: string', 'b: number']
Trim)"a: string" → 객체 타입 { a: string } 으로 변환 – ParseEntry<T>type ParseValue<T extends string> =
T extends 'string' ? string :
T extends 'number' ? number :
T extends 'boolean' ? boolean :
unknown;
type ParseEntry<T extends string> =
T extends `${infer Key}:${infer Val}`
? { [K in Trim<Key>]: ParseValue<Trim<Val>> }
: {};
a: string 을 a와 string으로 나누고type T3 = ParseEntry<'a: string'>; // { a: string }
type T4 = ParseEntry<'b:number'>; // { b: number }
UnionToIntersection<T>type UnionToIntersection<U> =
(U extends any ? (x: U) => any : never) extends (x: infer R) => any ? R : never;
type ParseObject<T extends string> =
UnionToIntersection<
ParseEntry<SplitBySemicolon<ExtractInnerText<T>>[number]>
>;
SplitBySemicolon<...>으로 얻은 타입은 튜플: ['a: string', 'b: number'][number]으로 유니온으로 바꿔줌: 'a: string' | 'b: number'ParseEntry로 파싱하면: { a: string } | { b: number }UnionToIntersection을 통해 { a: string } & { b: number }로 결합type ParseObject<T extends string> =
UnionToIntersection<
ParseEntry<SplitBySemicolon<ExtractInnerText<T>>[number]>
>;
type Result = ParseObject<'{ a: string; b: number; }'>;
// ✅ { a: string } & { b: number }
| 단계 | 목적 |
|---|---|
ExtractInnerText<T> | 문자열에서 { ... } 안 내용만 추출 |
SplitBySemicolon<T> | 각 key: value 쌍으로 분리 |
ParseEntry<T> | "a: string" 같은 쌍을 실제 객체로 변환 |
UnionToIntersection<T> | 각각의 객체를 하나로 병합 (&) |
ParseObject<T> | 최종 완성된 타입 파서 |