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.