| name | typescript-async-safety |
| description | TypeScript type safety, async correctness, error handling, and immutability patterns. Language-level domain knowledge independent of framework. Use when this capability is needed. |
| metadata | {"author":"buchananwill"} |
TypeScript Async and Safety Patterns
Type safety, async correctness, and error handling for TypeScript.
When to Activate
- Writing or reviewing TypeScript code
- Working with async operations
- Handling errors at system boundaries
- Ensuring type safety in public APIs
Type Safety
Avoid any
function process(data: any): any { }
function process(data: unknown): Result {
if (!isValidInput(data)) throw new Error('Invalid input')
return transform(data)
}
No Non-Null Assertion Without Guard
const name = user!.name
if (!user) throw new Error('User not found')
const name = user.name
Explicit Return Types on Public APIs
export function calculateScore(items: Item[]): number { }
export async function fetchUser(id: string): Promise<User | null> { }
const double = (n: number) => n * 2
Async Correctness
Parallelize Independent Work
const users = await fetchUsers()
const projects = await fetchProjects()
const stats = await fetchStats()
const [users, projects, stats] = await Promise.all([
fetchUsers(),
fetchProjects(),
fetchStats(),
])
Never Use async with forEach
items.forEach(async (item) => {
await processItem(item)
})
for (const item of items) {
await processItem(item)
}
await Promise.all(items.map(item => processItem(item)))
No Floating Promises
Every async call must be awaited, .catch()ed, or explicitly voided:
saveAnalytics(data)
await saveAnalytics(data)
saveAnalytics(data).catch(err => logger.error(err))
void saveAnalytics(data)
Error Handling
Never Swallow Errors
try { riskyOperation() } catch (e) { }
try {
riskyOperation()
} catch (error) {
logger.error('Operation failed:', error)
throw error
}
Wrap JSON.parse
const data = JSON.parse(rawString)
let data: unknown
try {
data = JSON.parse(rawString)
} catch {
throw new Error('Invalid JSON input')
}
Throw Error Objects
throw 'something went wrong'
throw { message: 'error' }
throw new Error('something went wrong')
Immutability
const updated = { ...user, name: 'New Name' }
const appended = [...items, newItem]
user.name = 'New Name'
items.push(newItem)
setCount(prev => prev + 1)
setCount(count + 1)
Source: buchananwill/ue-claude-scaffold — distributed by TomeVault.