Neople LogoNeople SDK JS

타입 정의

Neople SDK JS에서 사용하는 TypeScript 타입 정의 및 인터페이스

타입 정의

SDK에서 사용하는 TypeScript 타입 정의와 인터페이스에 대한 상세한 설명입니다.

neople-openapi-types 패키지

SDK는 neople-openapi-types 패키지의 타입 정의를 활용합니다.

클라이언트 설정 타입

ClientOptions

클라이언트 초기화 시 사용하는 옵션 타입입니다.

interface ClientOptions {
  baseURL?: string;
  timeout?: number;
  httpAdapter?: 'fetch' | 'axios' | 'got' | 'node-fetch';
  retryAttempts?: number;
  retryDelay?: number;
  userAgent?: string;
  debug?: boolean;
  onError?: (error: Error) => void;
  onRequest?: (url: string, options: any) => void;
  onResponse?: (response: any) => void;
  rateLimit?: RateLimitOptions;
  axiosInstance?: any; // Axios 어댑터 사용 시
  gotInstance?: any; // Got 어댑터 사용 시
  fetchInstance?: any; // Fetch 어댑터 사용 시
  fetchOptions?: any; // Fetch 옵션
}
  • baseURL (string, 선택사항): API 요청을 위한 사용자 지정 기본 URL
  • timeout (number, 선택사항): 요청 타임아웃 (밀리초, 기본값: 30000)
  • httpAdapter (string, 선택사항): 사용할 HTTP 클라이언트 어댑터 (기본값: 'fetch')
  • retryAttempts (number, 선택사항): 실패한 요청에 대한 재시도 횟수 (기본값: 3)
  • retryDelay (number, 선택사항): 재시도 간격 (밀리초, 기본값: 1000)
  • userAgent (string, 선택사항): 사용자 지정 User-Agent 헤더
  • debug (boolean, 선택사항): 디버그 모드 활성화 (기본값: false)
  • onError (function, 선택사항): 오류 발생 시 호출되는 콜백 함수
  • onRequest (function, 선택사항): 요청 전 호출되는 콜백 함수
  • onResponse (function, 선택사항): 응답 후 호출되는 콜백 함수

RateLimitOptions

속도 제한 옵션을 정의하는 타입입니다.

interface RateLimitOptions {
  requestsPerSecond?: number;
  burstLimit?: number;
  maxConcurrent?: number;
}
  • requestsPerSecond (number, 선택사항): 초당 최대 요청 수
  • burstLimit (number, 선택사항): 버스트 요청 한도
  • maxConcurrent (number, 선택사항): 최대 동시 요청 수

공통 응답 타입

ApiResponse<T>

모든 API 응답의 기본 구조를 나타내는 제네릭 타입입니다.

interface ApiResponse<T> {
  data: T;
  status: number;
  statusText: string;
  headers: Record<string, string>;
  timestamp: string;
}

PagedResponse<T>

페이지네이션이 있는 응답을 나타내는 타입입니다.

interface PagedResponse<T> {
  rows: T[];
  next: string | null;
  prev: string | null;
  total?: number;
  totalPages?: number;
  currentPage?: number;
  pageSize?: number;
}
  • rows (T[]): 결과 데이터 배열
  • next (string | null): 다음 페이지 URL (없으면 null)
  • prev (string | null): 이전 페이지 URL (없으면 null)
  • total (number, 선택사항): 전체 결과 수
  • totalPages (number, 선택사항): 전체 페이지 수
  • currentPage (number, 선택사항): 현재 페이지 번호
  • pageSize (number, 선택사항): 페이지당 결과 수

게임별 타입

게임별 상세 타입 정의는 다음 페이지들을 참조하세요:

오류 타입

ApiError

API 요청 중 발생하는 오류를 나타내는 타입입니다.

class ApiError extends Error {
  status: number;
  statusText: string;
  response?: any;
  request?: any;

  constructor(
    message: string,
    status: number,
    statusText: string,
    response?: any,
    request?: any
  );
}
  • message (string): 오류 메시지
  • status (number): HTTP 상태 코드
  • statusText (string): HTTP 상태 텍스트
  • response (any, 선택사항): 응답 객체
  • request (any, 선택사항): 요청 객체

NetworkError

네트워크 관련 오류를 나타내는 타입입니다.

class NetworkError extends Error {
  code: string;
  errno?: number;

  constructor(message: string, code: string, errno?: number);
}

TimeoutError

타임아웃 오류를 나타내는 타입입니다.

class TimeoutError extends Error {
  timeout: number;

  constructor(message: string, timeout: number);
}

유틸리티 타입

Optional<T, K>

특정 속성을 선택사항으로 만드는 유틸리티 타입입니다.

type Optional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;

// 사용 예시
type PartialClientOptions = Optional<
  ClientOptions,
  'timeout' | 'retryAttempts'
>;

RequiredFields<T, K>

특정 속성을 필수로 만드는 유틸리티 타입입니다.

type RequiredFields<T, K extends keyof T> = T & Required<Pick<T, K>>;

// 사용 예시
type RequiredClientOptions = RequiredFields<ClientOptions, 'baseURL'>;

SearchParams

검색 매개변수를 정의하는 타입입니다.

interface SearchParams {
  [key: string]: string | number | boolean | undefined;
}

타입 가드

타입 검증 함수

런타임에서 타입을 안전하게 확인하는 함수들입니다.

// API 응답 타입 가드
function isApiResponse<T>(obj: any): obj is ApiResponse<T> {
  return (
    obj &&
    typeof obj.status === 'number' &&
    typeof obj.statusText === 'string' &&
    obj.data !== undefined
  );
}

// 페이지 응답 타입 가드
function isPagedResponse<T>(obj: any): obj is PagedResponse<T> {
  return obj && Array.isArray(obj.rows);
}

// 오류 타입 가드
function isApiError(obj: any): obj is ApiError {
  return (
    obj instanceof Error &&
    typeof obj.status === 'number' &&
    typeof obj.statusText === 'string'
  );
}

function isNetworkError(obj: any): obj is NetworkError {
  return obj instanceof Error && typeof obj.code === 'string';
}

function isTimeoutError(obj: any): obj is TimeoutError {
  return obj instanceof Error && typeof obj.timeout === 'number';
}

타입 확장

사용자 지정 타입 확장

기본 타입을 확장하여 프로젝트에 맞는 사용자 지정 타입을 만들 수 있습니다.

// 사용자 지정 클라이언트 옵션
interface CustomClientOptions extends ClientOptions {
  apiVersion?: string;
  region?: 'kr' | 'global';
  cacheEnabled?: boolean;
  cacheTTL?: number;
}

// 사용자 지정 API 응답
interface CustomApiResponse<T> extends ApiResponse<T> {
  requestId: string;
  serverTime: string;
  version: string;
}

// 사용자 지정 오류 타입
class CustomApiError extends ApiError {
  errorCode: string;
  errorDetails?: Record<string, any>;

  constructor(
    message: string,
    status: number,
    statusText: string,
    errorCode: string,
    errorDetails?: Record<string, any>
  ) {
    super(message, status, statusText);
    this.errorCode = errorCode;
    this.errorDetails = errorDetails;
  }
}

사용 예제

타입 안전한 클라이언트 설정

import { NeopleDFClient, type ClientOptions } from 'neople-sdk-js';

const clientOptions: ClientOptions = {
  timeout: 30000,
  retryAttempts: 3,
  debug: true,
  onError: error => {
    console.error('API 오류:', error.message);
  },
};

const client = new NeopleDFClient(
  process.env.NEOPLE_DF_API_KEY!,
  clientOptions
);

타입 가드를 사용한 안전한 데이터 처리

async function processApiResponse<T>(
  apiCall: () => Promise<unknown>
): Promise<T | null> {
  try {
    const response = await apiCall();

    if (isApiResponse<T>(response)) {
      return response.data;
    }

    console.error('Invalid API response format');
    return null;
  } catch (error) {
    if (isApiError(error)) {
      console.error(`API Error ${error.status}: ${error.message}`);
    } else if (isNetworkError(error)) {
      console.error(`Network Error: ${error.message}`);
    } else if (isTimeoutError(error)) {
      console.error(
        `Timeout Error: Request timed out after ${error.timeout}ms`
      );
    } else {
      console.error('Unknown error:', error);
    }

    return null;
  }
}

커스텀 타입 확장 예제

// 프로젝트별 설정
interface ProjectConfig extends CustomClientOptions {
  projectName: string;
  environment: 'development' | 'staging' | 'production';
  features: {
    analytics: boolean;
    caching: boolean;
    debugging: boolean;
  };
}

function createConfiguredClient(config: ProjectConfig) {
  const baseOptions: ClientOptions = {
    timeout: config.environment === 'production' ? 30000 : 10000,
    debug: config.features.debugging && config.environment !== 'production',
    retryAttempts: config.environment === 'production' ? 3 : 1,
  };

  return new NeopleDFClient(process.env.NEOPLE_DF_API_KEY!, {
    ...baseOptions,
    ...config,
  });
}