Total Typescript - react & generic

김동하·2025년 4월 8일
0

typescript

목록 보기
7/21
post-thumbnail

1. type helper

Input이 있다. 이 Inputuncontrolledcontrolled를 동시에 수행해야 한다.

그래서 위와 같이 InputProps를 작성한다. 필수 타입으로 label이 있고, valueonChangecontrolled할 때만 필요하기 때문에 유니언으로 작성하고 uncontrolled일 때는 {}를 준다.

Input 컴포넌트는 문제 없이 타입을 적용했지만

실행부에서 무언가 이상한 지점이 발견되었다.

onChange없이 value만 있다거나 value가 없이 onChange만 있는 경우에 에러를 뱉지 않는 것이다.

이런 경우엔 undefined를 사용하면 된다. 필요없을 경우의 props를 유니언으로 undefined 지정해준다.

이제서야 제대로된 컴파일 에러가 난다.

하지만 InputProps의 props가 늘어날수록 점점 타입이 복잡해질 것이다.

그렇다면 재사용할 수 있는 확장 가능한 타입헬퍼로 만들어보자

AllOrNothing이라는 제네릭은 T 거나 객체의 모든 키를undefined로 만든 타입이다.

일단Result를 만들고 T에 props 타입을 지정해준다.

원하는 타입 형태와 비슷해지고 있다.

이제 uncontrolled일 경우, props가 undefined일 때를 지정해주면 되는데 이 부분을 Record를 활용하여 제네릭으로 만든다.

이제 원하는대로 타입이 지정된 것을 볼 수 있다. 복잡한 타입을 타입 헬퍼로 만들었다.

사용처에선 아래와 같이 정리하여 사용할 수 있다.

2. generic constraints

방금 만든 타입 헬퍼 AllOrNothing 잘 활용할 수 있을 것 같지만, 아직 해결해야할 부분이 남아있다.

AllOrNothing은 객체만을 받아야 하지만, T로 정한탓에 모든 타입이 허용된다. extends로 타입을 제한해줘야 한다.

이제 제대로된 컴파일 에러가 나오는 것을 확인할 수 있다.

하지만 extends object도 완벽하지 않다. 자바스크립트에선 배열도, null도 object이기 때문에.

정확히 객체 타입임을 지정하기 위해서 Record<string, any>를 사용해야 한다.

여기서 눈여겨 봐야할 점은 타입 제한을 cascade constraints한다는 것인데, AllOrNothin에서 extends를 제거하면 연관된 모든 타입에서 에러가 난다. 이와 같은 타입 패턴은 오픈소스 라이브러리에서 자주 활용된다.

3. passing type arguments to Component

위와 같은 테이블이 있다. table의 row는 아래와 같은 타입이라고 가정하자.

이제 테이블을 사용하려고 하는데 몇 가지 문제가 있다.

이렇게 rows의 데이터가 잘못된 타입이 들어오거나

rowsUser 타입의 속성이 잘못된 타입으로 쓰일 경우 에러가 나오지 않는다는 것이다.

UserTablerows에 지정하기 위해선 어떻게 해야할까?

놀랍게도 JSX 태그 끝나는 지점에 <User>을 넣어주면 된다...(신기하다)

이제 컴파일 에러가 제대로 나온다.

참고 : total typescript

profile
프론트엔드 개발

0개의 댓글