Skip to main content

typing-generic-responses

Defines generic types for cross-boundary data: ApiResponse<T>, Paginated<T>, Result<T,E>, Repository<T,ID>. Use when designing HTTP responses, use-case return types, or persistence ports.

소스 정보

저장소
j4flmao/agent_skills_nodejs_nestjs
최근 소스 활동
2026년 5월 3일 03:46
감지된 SKILL.md 언어
영어
스타
1
포크
0

설치 방법

기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.

소스 파일 검토

설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.

파일 탐색기
3 개 파일

SKILL.md 표시 중

SKILL.md
소스 지침 · 읽기 전용 미리보기
name
typing-generic-responses
description
Defines generic types for cross-boundary data: ApiResponse<T>, Paginated<T>, Result<T,E>, Repository<T,ID>. Use when designing HTTP responses, use-case return types, or persistence ports.
# Typing Generic Responses ## When to use - Designing HTTP response shapes - Defining use-case return types - Creating persistence ports (Repository interfaces) ## Core rules 1. `ApiResponse<T>` for all HTTP responses (success + error envelope) 2. `Result<T,E>` for use-case outputs (typed success/error without throwing) 3. `Paginated<T>` for list endpoint responses 4. `Repository<T,ID>` generic interface for persistence ports 5. All cross-boundary types are explicit, no `any` or `object` ## Reference shape (TypeScript) ### ApiResponse<T> ```typescript export interface ApiResponse<T = unknown> { readonly success: boolean; readonly data?: T; readonly error?: { code: string; message: string; details?: Record<string, unknown> }; readonly metadata?: { timestamp: string; traceId: string }; } ``` ### Result<T,E> ```typescript export type Result<T, E extends AppError = AppError> = | { readonly success: true; readonly value: T } | { readonly success: false; readonly error: E }; export const ok = <T>(value: T): Result<T, never> => ({ success: true, value }); export const err = <E extends AppError>(error: E): Result<never, E> => ({ success: false, error }); ``` ### Repository<T,ID> ```typescript export interface Repository<T, ID> { findById(id: ID): Promise<T | null>; save(entity: T): Promise<T>; deleteById(id: ID): Promise<boolean>; } ``` ## Examples — Do ```typescript // Use-case returns Result async execute(id: string): Promise<Result<User, NotFoundError>> { const user = await this.repo.findById(id); return user ? ok(user) : err(new NotFoundError('User', id)); } ``` ## Examples — Don't ```typescript // ❌ No typing async findUser(id: string): Promise<any> { ... } // ❌ Direct HTTP response from use-case return res.status(200).json({ data: user }); ``` ## Checklist - [ ] `ApiResponse<T>` used for all HTTP responses - [ ] `Result<T,E>` used for use-case returns - [ ] `Repository<T,ID>` generic interface defined - [ ] No `any` in cross-boundary types See [reference/generic-patterns.md](./reference/generic-patterns.md) for full patterns.
GitHub에서 보기