(rough) 타입스크립트를 이용한 풀스택 강좌 - 비동기 적용하기

44523·2024년 1월 26일

iRPC를 실제로 사용할 수 있는 promise를 반환하는 타입으로 만들어야한다.

const res = rpcImpl.createPost({body:"안녕하세요"})
-> res: CreatePostResponse
const res = rpcImpl.createPost({body:"안녕하세요"})
-> res: Promise<CreatePostResponse>

서버의 기능들을 잘 정의해놓았지만 이 타입을 그대로 구현하려면 비동기 처리 없이 값을 바로 반환해야하는데, 비동기 처리 없이 통신을 하는것은 불가능하기 때문에 모든 반환타입에 promise가 붙어야한다.

방법은 2가지가 있다.

  1. 직접 모든 타입뒤에 Promise를 붙인다.
    -> ...: (...) => Promise<...>
    -> ...: (...) => Promise<...>
    -> ...: (...) => Promise<...>

  2. 타입스크립트를 활용한다. 리턴 타입만 Promise로 정의하는 방법.
    type PromiseRpc= {...}

읽기에 더 깔끔하고, 나중에 어떤 기능에 입출력 타입을 참조해야할때가 있는데 그럴때 출력타입에 프러미스가 붙어있으면 그걸 어짜피 유틸리티 타입을 통해서 제거해주어야 하기 떄문이다.

IRpc와 똑같은 properties, 각 property는 IRpc와 똑같은 인자여야 하고 Promise<반환> 프러미스를 반환해야한다

  • Index Signature
  • Generic
  • Conditional Type
  • infer
    를 통해서 구현해보자.

어떻게 리턴 타입만 promise로 감싸주느냐?
타입을 받아서 프로미스로 리턴값을 바꿔주는 제네릭타입을 하나 만든다.

type PromiseReturn<F> = F

이 제네릭 타입 F를 함수로 제안한다.

type AnyFunction = (...args: any) => any;
type PromiseReturn<F extends AnyFunction> = F;

테스트

type AnyFunction = (...args: any) => any;
type PromiseReturn<F extends AnyFunction> = F extends (
    ...args: infer A
    ) => infer R 
    ? (...args: A) => Promise<R> //Promise로 리턴값을 감싸주면 끝
    : never;

type t1 = PromiseReturn<string>;
type t2 = PromiseReturn<string() => string>;
type t3 = PromiseReturn<string(a: number, b: string, c: boolean) => string>;

0개의 댓글