Avoid comments. Let clear function names and TypeScript types document your code.
JSDoc comments are not used in this project. They duplicate what the code already says and become stale.
❌ Avoid:
/**
* This function filters users to only include active ones,
* then sorts them by their registration date in ascending order.
* @param users - Array of user objects
* @returns Filtered and sorted array of active users
*/
const process = (users: User[]) =>
users
.filter((user) => user.isActive)
.toSorted((a, b) => a.registrationDate - b.registrationDate)
✅ Good:
import { Array, flow } from 'effect'
const getActiveUsersSortedByRegistrationDate = flow(
Array.filter((user: User) => user.isActive),
Array.sort((a, b) => a.registrationDate - b.registrationDate),
)
If you feel the need to add a comment because the code is complex, don’t add the comment — extract the complex part to well-named functions.
❌ Avoid:
const getEligibleUsers = (users: User[]) =>
users.filter(
// User must be active, over 18, and have verified email
(user) => user.isActive && user.age >= 18 && user.emailVerified
)
✅ Good:
const isActive = (user: User) => user.isActive
const isAdult = (user: User) => user.age >= 18
const hasVerifiedEmail = (user: User) => user.emailVerified
const getEligibleUsers = flow(
Array.filter(isActive),
Array.filter(isAdult),
Array.filter(hasVerifiedEmail),
)
Benefits of extracting to functions:
isActive, isAdult, hasVerifiedEmail in other contextsflowWhen you have complex filter expressions, boolean logic, or transformations — extract them:
❌ Avoid:
const result = users.filter(
(user) =>
user.role === 'admin' ||
(user.role === 'moderator' && user.permissions.includes('delete')) ||
user.isSuperUser
)
✅ Good:
const canDeleteContent = (user: User) =>
user.role === 'admin' ||
(user.role === 'moderator' && user.permissions.includes('delete')) ||
user.isSuperUser
const getUsersWhoCanDeleteContent = flow(
Array.filter(canDeleteContent),
)
Now canDeleteContent can be tested, reused, and composed with other functions.