typescript
Summary
TypeScript style and type-safety conventions for consistent, maintainable code across the project.
- Enforce strict typing: avoid implicit
any, preferinterfacefor object shapes andtypefor unions, useas const satisfiespatterns, and leverage type inference where possible - Async-first patterns: use
async/awaitover callbacks, promise-based APIs fromfs/promises, andPromise.all/Promise.racefor concurrent operations - Import discipline: separate type imports with
import type { ... }, keep type and value imports as distinct statements, and sort specifiers alphabetically - UI and performance: use
@lobehub/uiand Ant Design components withantd-styletokens, preferfor…ofloops, and reuse utilities frompackages/utils - Logging safety: never log private data, always catch and log errors explicitly, and avoid silent
.catch()handlers that hide failures
SKILL.md
TypeScript Code Style Guide
Types and Type Safety
- Avoid explicit type annotations when TypeScript can infer
- Avoid implicitly
any; explicitly type when necessary - Use accurate types: prefer
Record<PropertyKey, unknown>overobjectorany - Prefer
interfacefor object shapes (e.g., React props); usetypefor unions/intersections - Prefer
as const satisfies XyzInterfaceover plainas const - Prefer
@ts-expect-errorover@ts-ignoreoveras any - Avoid meaningless null/undefined parameters; design strict function contracts
- Prefer ES module augmentation (
declare module '...') overnamespace; do not introducenamespace-based extension patterns - When a type needs extensibility, expose a small mergeable interface at the source type and let each feature/plugin augment it locally instead of centralizing all extension fields in one registry file
- For package-local extensibility patterns like
PipelineContext.metadata, define the metadata fields next to the processor/provider/plugin that reads or writes them
Async Patterns
- Prefer
async/awaitover callbacks or.then()chains - Prefer async APIs over sync ones (avoid
*Sync) - Use promise-based variants:
import { readFile } from 'fs/promises' - Use
Promise.all,Promise.racefor concurrent operations where safe
Imports
- This project uses
simple-import-sort/importsandconsistent-type-imports(fixStyle: 'separate-type-imports') - Separate type imports: always use
import type { ... }for type-only imports, NOTimport { type ... }inline syntax - When a file already has
import type { ... }from a package and you need to add a value import, keep them as two separate statements:import type { ChatTopicBotContext } from '@lobechat/types'; import { RequestTrigger } from '@lobechat/types'; - Within each import statement, specifiers are sorted alphabetically by name
Code Structure
- Prefer object destructuring
- Use consistent, descriptive naming; avoid obscure abbreviations
- Replace magic numbers/strings with well-named constants
- Defer formatting to tooling
UI and Theming
- Use
@lobehub/ui, Ant Design components instead of raw HTML tags - Design for dark mode and mobile responsiveness
- Use
antd-styletoken system instead of hard-coded colors
Performance
- Prefer
for…ofloops over index-basedforloops - Reuse existing utils in
packages/utilsor installed npm packages - Query only required columns from database
Time Consistency
- Assign
Date.now()to a constant once and reuse for consistency
Logging
- Never log user private information (API keys, etc.)
- Don't use
import { log } from 'debug'directly (logs to console) - Use
console.errorin catch blocks instead of debug package - Always log the error in
.catch()callbacks — silent.catch(() => fallback)swallows failures and makes debugging impossible
Weekly Installs
980
Repository
lobehub/lobehubGitHub Stars
74.7K
First Seen
Jan 27, 2026
Security Audits
Installed on
opencode851
codex846
gemini-cli835
github-copilot812
kimi-cli744
amp740