말그대로 인터페이스 OnlyIdKeys
는 id 관련 키만 추출하는 타입이다. Example
에서 id 관련 키만 추출해보자.
이렇게 키를 순회하는 타입의 기본적인 형태로 일단 만든다.
이제 여기서 id
와 관련된 키만 추출해야한다. 가장 먼저 템플릿 리터럴을 떠올릴 수 있다.
regex 비슷하게 앞뒤로 string를 두고 id가 될 수 있는 템플릿 리터럴를 만든다.
잘 작동한다. 그럼 [K in keyof T]
에 SearchForId
를 extends
로 넣어줘야 한다.
이젠 되지 않았을까 생각했는데, "?"를 까먹었냐는 친절한 에러가 나온다!
extends에 SearchForId
에 속할 경우, K
를 아니면 never
를 반환해야 한다.
(이정도로까지 해야하나 타입..?)
그럼 id 관련 키만 잘 추출될 것을 확인할 수 있다.
좋다... key로 갈 때까지 가보자...
route, search
를 키로 갖는 객체를 유니언으로 정한 Route
라는 타입이 있다.
유니언으로 되어 있는 Route
이 타입의 value를 key로 갖는 하나의 합쳐진 타입 형태로 추출하려고 한다. 스텝 바이 스텝으로 가보자!
일단 그냥 키 맵핑을 해서 value가 key가 될 수 있도록 한다.
route
만 맵핑하면
이렇게 된다. 이제 각 value는 search
의 value를 가져와야 한다.
여기에 사용할 수 있는 아주 적절한 Extract
라는 녀석을 사용해보자
Extract
는 js 메서드로 치면 find 같은 녀석이다. 이 녀석을 제네릭으로 바꿔서 search
의 밸류를 가져와보자.
아주 완벽하게 가져오는 것을 확인할 수 있다.
사실 as
를 사용한 더 쉬운 방법이 있다.
(여기부터 살짝 머리가 안 돌아간다)
[R in Route]:
은 Route
유니온 타입의 각 객체를 순회한다. as R["route"]
를 통해 각 객체의 route 값을 새 키로 사용한다.이제 위와 동일하게 search
도 해주면 된다.
아주 깔끔하게 완성이다.
참고 : total typescript