타입스크립트로 `directive @${DirectiveName} on ${Directiv...
# 클럽-프론트엔드
u
타입스크립트로
directive @${DirectiveName} on ${DirectiveLocation}
형태 타입을 만들어보고 있는데 여러개의 directive location 을 선언할 수 있도록 타입을 지정해주려면 어떻게 해야 할까요?
h
음..? 이걸 왜 template literal type 으로 ㅋㅋㅋ
u
이렇게는 해줬는데
FIELD_DEFINITION | OBJECT
같이 해줄 수도 있을까요?.?
h
뭐가 되면 되는건가요
u
just for fun 이긴 합니다 ㅋㅋ
h
재귀함수 만드시면 됩니다
u
타입에 대한 재귀를 말씀하시는건가요?
h
넴 리터럴리 재귀함수
근데 좀 애매한게
그냥 저걸 다 묶어서 돌리면 스펙이랑 호환되지 않을거기 때문에
타입이 다 세분화 되어야 할거에요
u
오호..
h
그냥 재귀돌리는건 해서 보여드릴게요
ohh 1
u
감사합니다 ㅎㅎ 제너릭 타입에 대해서는 예쩐에 Awaited 처럼 시도하면 대략 감이 잡힐듯 한데 지금처럼 타입이 된 경우에는 어떻게 해야 하나 고민중이던 찰나였습니다
h
아 왜 playground 는 vim 입력도 지원 안하나요
불편하네
u
tmi: 여러개에 대한 추론은 just for fun 인데 지금같은 형태를 쓴건 디렉티브에 쓸 수 있는 로케이션이 뭐뭐 있는지 아직 몰라서 만들게 되었습니다
h
음 근데 팩토리얼이라서 이대로는 안될거같은데 ㅋㅋ
재귀 깊이가 50까지밖에 안내려가요
타입스크립트 제약사항
u
오 그런 제약이 있군요?
h
음 ㅋㅋㅋ
일단 너무 기다리시면 재미없으니
몇가지 기본 세트를 먼저 제공해드리겠습니다
이것만 있어도 감잡고 푸실 수 있을 것 같아요
이걸로 이제 원하는 조건식 포함한 재귀함수를 만드시면 됩니다
깊이(차수) 제한 안에서 원하시는걸 다 할 수 있음
u
오 한번 츄라이 해보겠습니다
h
디렉티브에 쓸 수 있는 로케이션이 뭐뭐 있는지 아직 몰라서 만들게 되었습니다
요건 GraphQL 명세에 다 나와있어용
u
네네네 볼때마다 들락날락 하게 되어서 움 그냥 북마크를 좀더 자주 보는것도 방법이겠지만요 ㅋㅋㅋ
h
그냥 validate schema 하면 알려주긴 합니다 ㅋㅋㅋㅋ
인덱스 번호 다루기 위해 산술연산 필요하시면 이런식으로..
Copy code
type MakeTuple<T, N extends number, Result extends readonly T[] = []> = {
  0: Result,
  1: MakeTuple<T, N, [T, ...Result]>,
}[Result['length'] extends N ? 0 : 1];

type AddOne<N extends number> = [...MakeTuple<unknown, N>, unknown]['length'] & number;
type Add<A extends number, B extends number> = [...MakeTuple<unknown, A>, ...MakeTuple<unknown, B>]['length'] & number;

type SubOne<N extends number> = MakeTuple<unknown, N> extends [unknown, ...infer Tail] ? Tail['length'] : never;
type Sub<A extends number, B extends number> = B extends 0 ? A : Sub<SubOne<A>, SubOne<B>>;

type Mul<A extends number, B extends number, Result extends number = 0> = B extends 0 ? Result : Mul<A, SubOne<B>, Add<Result, A>>;
암튼 그냥 코드 제너레이터를 만드시는게 정신건강 + 맥북수명 + 탄소절감에 훨신 이롭습니다
zzzz 1