Replies: 1 comment
-
저도 비슷한 경험이 있었고, 결국 Discriminated Union + type guard 조합으로 갔습니다. 타입 추론이 깨지는 부분은 TS 제너릭의 한계라 어쩔 수 없는 것 같고, RHF에서 as 또는 type guard를 써서 해결하긴 했습니다. 폼 복잡도가 더 올라갈 경우에는 타입별 폼 컴포넌트를 분리하고, switch-case나 registry 패턴으로 대응하는 것도 추천드려요! {fields.map((field, index) => {
switch (field.type) {
case 'D':
return <DTypeCreativeForm field={field} index={index} />;
case 'A':
return <ACreativeForm field={field} index={index} />;
...
}
})} |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
논의하고 싶은 주제 소개를 위해 예시를 재구성 해보았습니다.
우리는 광고 소재를 관리하는 폼을 만듭니다.
최초의 요구사항은 다음과 같습니다.
이에 최초 타입을 후다닥 다음과 같이 정의하게 되었어요.
나: 🙂
한 달 후
나: 😒
두 달 후
나: 😕
세 달 후
나: 😟
여섯 달 후
나: 😡
마침 새로 합류한 팀원이 묻습니다.
Discriminated Union으로 리팩토링
이쯤되면 아차! 싶습니다.
빠르게 리팩토링 시간을 갖고 타입을 Discriminated Union로 변경합니다.
비록 타입이 추가될 때마다 추가되는 코드의 양은 늘겠지만, 타입별 필드가 명확하게 구분되었고, 런타임 validation도 훨씬 견고해졌습니다.
하지만...
우리는 RHF을 가지고 이 스키마 타입을 기반으로 이제 폼을 그려야합니다.
오잉? 추론된 field가 초라해졌어요. 무소유라도 실천하는 걸까요.
왜 이런 일이 일어났을까?
z.infer는 discriminatedUnion이기 때문에
타입스크립트는 field의 타입을 AType | BType | CType | DType 의 union으로 간주하게 됩니다.
그런데 useFieldArray에서의 fields는 내부적으로 FieldArrayWithId 타입을 따르며,
여기서는 공통 필드만 추론되도록 좁은 타입 추론이 일어나게 됩니다.
그 결과:
해결?
위처럼 타입 분기처리를 하거나, type assertion, type guard를 사용하는 방법으로 해결할 수 있겠으나,
이런 방법을 하려고 내가 리팩토링을 했나 현타가 옴과 동시에 Discriminated Union이 정말 최선인가? 생각이 듭니다.
(과거로 돌아가 optional chaining을 남발하고 싶은 욕구도 치솟습니다.)논의해보고 싶은 지점들
다들 유사한 경험이 있으실 것 같아요.
1.1 리팩토링 결정하는 시점은 언제인가요?
1.2 리팩토링 시점에 대한 판단 기준은 무엇인가요?
10 votes ·
Beta Was this translation helpful? Give feedback.
All reactions