A collection of pure JavaScript and TypeScript coding practices for mastering core concepts and sharpening problem-solving skills.
https://biallo.github.io/js-coding-practice/
npm install
npm run devnpm run buildEach problem lives in its own folder under src/data/problems. To add a new one:
- Create a new folder such as
src/data/problems/debounce. - Add an
index.tsfile for the problem metadata. - Add solution files.
For a problem with one solution approach, use root-level files:
src/data/problems/debounce/
index.ts
solution.js
solution.tsFor a problem with multiple solution approaches, use a solutions folder:
src/data/problems/flatten/
index.ts
solutions/
recursive.js
recursive.ts
iterative.js
iterative.ts- Import solution files with Vite raw imports:
import javascriptSolution from './solution.js?raw';
import typescriptSolution from './solution.ts?raw';For multiple approaches:
import iterativeJavascriptSolution from './solutions/iterative.js?raw';
import iterativeTypescriptSolution from './solutions/iterative.ts?raw';
import recursiveJavascriptSolution from './solutions/recursive.js?raw';
import recursiveTypescriptSolution from './solutions/recursive.ts?raw';- Export a
PracticeProblemobject from the problem folder'sindex.ts. - Add it to the array in
src/data/problems/index.ts.
Single-solution example:
export const debounceProblem: PracticeProblem = {
id: 'debounce',
title: 'Debounce',
difficulty: 'Medium',
description: '...',
points: [
'`func` (Function): The callback to debounce.',
'`wait` (number): The number of milliseconds to wait.',
'(Function): Returns the debounced function.',
],
solutions: [
{
title: 'Basic',
javascript: javascriptSolution.trim(),
typescript: typescriptSolution.trim(),
},
],
};Multiple-solution example:
export const flattenProblem: PracticeProblem = {
id: 'flatten',
title: 'Flatten',
difficulty: 'Medium',
description: '...',
points: [
'`array` (Array): The array to flatten.',
'(Array): Returns a new flattened array.',
],
solutions: [
{
title: 'Recursive',
javascript: recursiveJavascriptSolution.trim(),
typescript: recursiveTypescriptSolution.trim(),
},
{
title: 'Iterative Stack',
javascript: iterativeJavascriptSolution.trim(),
typescript: iterativeTypescriptSolution.trim(),
},
],
};Problem fields:
id: Unique problem id.title: Sidebar and detail title.difficulty:Easy,Medium, orHard.description: Prompt description.points: Requirements, edge cases, or interview notes.solutions: Array of solution approaches.solutions[].title: Approach name shown in the solution approach selector.solutions[].javascript: Raw-imported JavaScript solution.solutions[].typescript: Raw-imported TypeScript solution.
Solution files are intentionally ignored by ESLint and TypeScript app checking. This keeps example code flexible while the raw imports still render in the UI.
Prompt formatting:
- Wrap identifiers in backticks, for example
debounce(func, wait), to render inline code. - Use
\nfor a line break inside a paragraph. - Use
\n\nto start a new paragraph.