2026-02-11 23:48:45 -08:00
|
|
|
---
|
|
|
|
|
paths:
|
|
|
|
|
- "**/*.ts"
|
|
|
|
|
- "**/*.tsx"
|
|
|
|
|
- "**/*.js"
|
|
|
|
|
- "**/*.jsx"
|
|
|
|
|
---
|
2026-02-05 21:58:06 +08:00
|
|
|
# TypeScript/JavaScript Patterns
|
|
|
|
|
|
|
|
|
|
> This file extends [common/patterns.md](../common/patterns.md) with TypeScript/JavaScript specific content.
|
2026-01-17 17:49:33 -08:00
|
|
|
|
|
|
|
|
## API Response Format
|
|
|
|
|
|
|
|
|
|
```typescript
|
|
|
|
|
interface ApiResponse<T> {
|
|
|
|
|
success: boolean
|
|
|
|
|
data?: T
|
|
|
|
|
error?: string
|
|
|
|
|
meta?: {
|
|
|
|
|
total: number
|
|
|
|
|
page: number
|
|
|
|
|
limit: number
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Custom Hooks Pattern
|
|
|
|
|
|
|
|
|
|
```typescript
|
|
|
|
|
export function useDebounce<T>(value: T, delay: number): T {
|
|
|
|
|
const [debouncedValue, setDebouncedValue] = useState<T>(value)
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
const handler = setTimeout(() => setDebouncedValue(value), delay)
|
|
|
|
|
return () => clearTimeout(handler)
|
|
|
|
|
}, [value, delay])
|
|
|
|
|
|
|
|
|
|
return debouncedValue
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Repository Pattern
|
|
|
|
|
|
|
|
|
|
```typescript
|
|
|
|
|
interface Repository<T> {
|
|
|
|
|
findAll(filters?: Filters): Promise<T[]>
|
|
|
|
|
findById(id: string): Promise<T | null>
|
|
|
|
|
create(data: CreateDto): Promise<T>
|
|
|
|
|
update(id: string, data: UpdateDto): Promise<T>
|
|
|
|
|
delete(id: string): Promise<void>
|
|
|
|
|
}
|
|
|
|
|
```
|