From aigroup-workflow
Implements advanced TypeScript types like generics, conditional/mapped types, discriminated unions, type guards, utility/branded types; configures tRPC for end-to-end safety in monorepos.
npx claudepluginhub codeape-7/ai-agent-workflowgroupThis skill uses the workspace's default tool permissions.
1. **Analyze type architecture** - Review tsconfig, type coverage, build performance
Implements advanced TypeScript types including generics, conditional/mapped types, discriminated unions, type guards, utility/branded types; configures tRPC for end-to-end type safety in monorepos.
Applies opinionated TypeScript conventions including branded types, advanced generics, conditional/utility types, type guards, discriminated unions, strict tsconfig, tRPC, monorepos.
Provides advanced TypeScript expertise for complex types, generics, decorators, strict safety, and enterprise architectures. Use for typing issues, shared types, and production hardening.
Share bugs, ideas, or general feedback.
tsc --noEmit to catch type errors before proceedingtsc --noEmit to confirm zero errors after changestype-coverage; validate that all public APIs have explicit return types; iterate on steps 3–4 until all checks passLoad detailed guidance based on context:
| Topic | Reference | Load When |
|---|---|---|
| Advanced Types | references/advanced-types.md | Generics, conditional types, mapped types, template literals |
| Type Guards | references/type-guards.md | Type narrowing, discriminated unions, assertion functions |
| Utility Types | references/utility-types.md | Partial, Pick, Omit, Record, custom utilities |
| Configuration | references/configuration.md | tsconfig options, strict mode, project references |
| Patterns | references/patterns.md | Builder pattern, factory pattern, type-safe APIs |
// Branded type for domain modeling
type Brand<T, B extends string> = T & { readonly __brand: B };
type UserId = Brand<string, "UserId">;
type OrderId = Brand<number, "OrderId">;
const toUserId = (id: string): UserId => id as UserId;
const toOrderId = (id: number): OrderId => id as OrderId;
// Usage — prevents accidental id mix-ups at compile time
function getOrder(userId: UserId, orderId: OrderId) { /* ... */ }
type LoadingState = { status: "loading" };
type SuccessState = { status: "success"; data: string[] };
type ErrorState = { status: "error"; error: Error };
type RequestState = LoadingState | SuccessState | ErrorState;
// Type predicate guard
function isSuccess(state: RequestState): state is SuccessState {
return state.status === "success";
}
// Exhaustive switch with discriminated union
function renderState(state: RequestState): string {
switch (state.status) {
case "loading": return "Loading…";
case "success": return state.data.join(", ");
case "error": return state.error.message;
default: {
const _exhaustive: never = state;
throw new Error(`Unhandled state: ${_exhaustive}`);
}
}
}
// Deep readonly — immutable nested objects
type DeepReadonly<T> = {
readonly [K in keyof T]: T[K] extends object ? DeepReadonly<T[K]> : T[K];
};
// Require exactly one of a set of keys
type RequireExactlyOne<T, Keys extends keyof T = keyof T> =
Pick<T, Exclude<keyof T, Keys>> &
{ [K in Keys]-?: Required<Pick<T, K>> & Partial<Record<Exclude<Keys, K>, never>> }[Keys];
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"noUncheckedIndexedAccess": true,
"noImplicitOverride": true,
"exactOptionalPropertyTypes": true,
"isolatedModules": true,
"declaration": true,
"declarationMap": true,
"incremental": true,
"skipLibCheck": false
}
}
satisfies operator for type validationAnnotated pattern with type predicatesany without justificationas assertions without necessityas const)When implementing TypeScript features, provide:
TypeScript 5.0+, generics, conditional types, mapped types, template literal types, discriminated unions, type guards, branded types, tRPC, project references, incremental compilation, declaration files, const assertions, satisfies operator