te6.in
Blog
글 코드 조각 태그
글
코드 조각
태그
  • iOS 7
  • 소셜 미디어 6
  • 생산성 5
  • 팁 5
  • 회고 5
  • Google 4
  • iPhone 4
  • macOS 4
  • 단축어 4
  • 자동화 4
  • 해커톤 4
  • 후기 4
  • AI 3
  • LLM 3
  • TypeScript 3
  • 뉴스레터 3
  • 대전 3
  • 영문학 3
  • 일상 3
  • GitHub 2
  • iCloud 2
  • Instagram 2
  • 군대 2
  • 디자인 시스템 2
  • 유틸리티 2
  • 카카오톡 2
  • 캘린더 2
  • AirDrop 1
  • Apps Script 1
  • Astro 1
  • BeReal 1
  • ChatGPT 1
  • Gemini 1
  • Git 1
  • Homebrew 1
  • iMessage 1
  • JavaScript 1
  • JSON 1
  • KAIST 1
  • KUCC 1
  • NameDrop 1
  • Next.js 1
  • Node.js 1
  • Perplexity 1
  • Raycast 1
  • SaaS 1
  • SPARCS 1
  • Spotlight 1
  • Swift 1
  • UX 1
  • UX 라이팅 1
  • 공군해커톤 1
  • 당근 1
  • 돈 1
  • 디지털 권리 1
  • 멀티모달 1
  • 번역 1
  • 법률 1
  • 브랜딩 1
  • 블로그 1
  • 스프레드시트 1
  • 신한 1
  • 절약 1
  • 텔레그램 1
  • 핀테크 1
  • 현지화 1

JSON 응답에 적절한 타입 주기

  • TypeScript 3
  • JSON 1
  • 찬휘 te6
작성 2023. 8. 28. 수정 2023. 8. 28.
// response.ts

type FailResponse<T> = {
  ok: false;
  error: string;
} & T;

type SuccessResponse<T> = {
  ok: true;
} & T;

export type DefaultResponse<T = {}, U = {}> = SuccessResponse<T> | FailResponse<U>;
// route.ts (Next.js)

export type NewStatusResponse = DefaultResponse<
  {
    id: string;
  },
  {
    supportedServers?: string[];
    clientServer?: string;
  }
>;

// ...

return NextResponse.json<NewStatusesResponse>(
  { ok: false, error: "Not logged in" },
  { status: 401 },
);

// OR

return NextResponse.json<NewStatusResponse>(
  {
    ok: false,
    error: "BETA_LIMITED_SERVER_ERROR",
    supportedServers,
    clientServer,
  },
  { status: 403 },
);

// OR

return NextResponse.json<NewStatusResponse>({ ok: true, id: status.id });
// page.tsx (Next.js)

const [submit, { data, isLoading }] = useMutation<
  NewStatusResponse, // 이게 data의 타입으로 들어가도록 useMutation 정의에서 제너릭을 사용했어요
  NewStatusRequest
>("/api/post", "POST");

useEffect(() => {
  if (data && data.ok) {
    mutate("/api/post");
    router.replace(`/post/${data.id}`);

    return;
  }

  if (data && !data.ok && data.error === "BETA_LIMITED_SERVER_ERROR") {
    setShowBetaError(true);

    return;
  }
}, [data, router]);

위 코드에 따라 적절하게 data 변수의 타입 추론이 된 모습

첫 번째 글이에요.
Next.js searchParams에 적절한 타입 주기
다음 글
모든 코드 조각 보기
블로그 마지막 업데이트 2025년 11월 10일 01:48

microsoft/fluentui-emoji is licensed under the MIT License.
Copyright (c) Microsoft Corporation.