<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mozayk</title>
    <description>The latest articles on DEV Community by Mozayk (@mozayktech).</description>
    <link>https://dev.to/mozayktech</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F11064%2F94b92888-3b47-40fc-967c-7ad299e62e57.png</url>
      <title>DEV Community: Mozayk</title>
      <link>https://dev.to/mozayktech</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mozayktech"/>
    <language>en</language>
    <item>
      <title>A Reasonable Way to Write TypeScript</title>
      <dc:creator>José Lucas Oliveira</dc:creator>
      <pubDate>Wed, 18 Jun 2025 23:46:08 +0000</pubDate>
      <link>https://dev.to/mozayktech/a-reasonable-way-to-write-typescript-3640</link>
      <guid>https://dev.to/mozayktech/a-reasonable-way-to-write-typescript-3640</guid>
      <description>&lt;h2&gt;
  
  
  Why Another Style Guide?
&lt;/h2&gt;

&lt;p&gt;If you're a JavaScript or TypeScript developer, you're likely familiar with style guides like &lt;a href="https://github.com/airbnb/javascript#readme" rel="noopener noreferrer"&gt;Airbnb's popular JavaScript guidelines&lt;/a&gt;. These guides help keep code clean and consistent. But why create another one specifically for TypeScript? Simply put, TypeScript offers unique features and challenges, that standard JavaScript guides might not fully address.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/mozayk/typescript-style-guide#readme" rel="noopener noreferrer"&gt;&lt;strong&gt;Mozayk TypeScript Style Guide&lt;/strong&gt;&lt;/a&gt; takes inspiration from established guides but focuses explicitly on TypeScript's strengths, like robust typing, modern syntax and built-in safeguards. Rather than patching TypeScript onto an existing JavaScript framework, Mozayk's guide is TypeScript-first from the ground up.&lt;/p&gt;

&lt;p&gt;Plus, it's also &lt;a href="https://github.com/mozayk/typescript-style-guide#extract-rules-for-ai-agents" rel="noopener noreferrer"&gt;AI-friendly&lt;/a&gt;, structured to be easily parsed and followed by AI agents or code-generation tools, making it a great fit for modern workflows that include automated refactoring or agentic-style assistance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Philosophy and Core Principles
&lt;/h2&gt;

&lt;p&gt;Mozayk's style guide emphasizes three main things: &lt;strong&gt;safety, consistency and developer happiness&lt;/strong&gt;. Here's what that looks like in practice:&lt;/p&gt;

&lt;h3&gt;
  
  
  Type Safety Above All
&lt;/h3&gt;

&lt;p&gt;Prioritizes strict type safety. This means actively avoiding &lt;code&gt;any&lt;/code&gt; types unless truly necessary and mandating explicit handling of promises. Using TypeScript fully helps eliminate common bugs upfront.&lt;/p&gt;

&lt;h3&gt;
  
  
  Consistency without Nitpicking
&lt;/h3&gt;

&lt;p&gt;Consistent code makes teamwork smoother. Incorporates widely-accepted conventions, such as single quotes for strings, two-space indentation and trailing commas for clearer diffs. Predefined guidelines reduce unnecessary debates, letting teams focus on real code issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  Embracing Modern TypeScript
&lt;/h3&gt;

&lt;p&gt;Recommends modern TypeScript practices. It avoids outdated patterns, such as namespaces, favoring modern modules instead. It promotes using &lt;code&gt;as const&lt;/code&gt; assertions and avoids known JavaScript pitfalls, like using &lt;code&gt;for-in&lt;/code&gt; loops incorrectly. These modern guidelines future-proof your projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automated Formatting with ESLint &amp;amp; Prettier
&lt;/h3&gt;

&lt;p&gt;Relies heavily on automation, integrating ESLint for logic and correctness alongside Prettier for consistent formatting. This combo eliminates manual style adjustments, allowing developers to concentrate on writing robust logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  React-Friendly and Modular
&lt;/h3&gt;

&lt;p&gt;Includes specific guidelines for React projects, covering common issues like accessibility checks and hook usage. Non-React projects simply omit React guidelines, keeping configurations flexible and relevant.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inspired by Community
&lt;/h3&gt;

&lt;p&gt;Integrates proven best practices from popular open-source style guidelines. Every guideline is justified clearly, ensuring they aren't arbitrary but purposeful and helpful.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Included?
&lt;/h2&gt;

&lt;p&gt;Mozayk's style guide provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Complete ESLint Configuration&lt;/strong&gt;: Covering TypeScript-specific guidelines and best practices to prevent bugs early.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prettier Configuration&lt;/strong&gt;: Automatically formats code, enforcing a clean style (two-space indentation, single quotes, trailing commas and 100-character line length).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React/JSX Configurations&lt;/strong&gt;: Includes guidelines to manage React-specific scenarios like hooks and accessibility, ensuring front-end code stays clean.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modularity&lt;/strong&gt;: Packages are separated by functionality, so teams can easily adopt what they need without unnecessary guidelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Always Current&lt;/strong&gt;: Supports the latest standards, including ESLint v9, Prettier v3 and TypeScript v5, ensuring compatibility with emerging tech.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;To implement Mozayk's guide in your project:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Installation
&lt;/h3&gt;

&lt;p&gt;Install Mozayk configurations and dependencies via &lt;code&gt;npm&lt;/code&gt; or &lt;code&gt;yarn&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  @mozayk/eslint-config-base &lt;span class="se"&gt;\&lt;/span&gt;
  @mozayk/eslint-config-typescript &lt;span class="se"&gt;\&lt;/span&gt;
  @mozayk/eslint-config-react &lt;span class="se"&gt;\&lt;/span&gt;
  @mozayk/prettier-config &lt;span class="se"&gt;\&lt;/span&gt;
  @typescript-eslint/eslint-plugin@^8 &lt;span class="se"&gt;\&lt;/span&gt;
  @typescript-eslint/parser@^8 &lt;span class="se"&gt;\&lt;/span&gt;
  eslint@^9.7 &lt;span class="se"&gt;\&lt;/span&gt;
  eslint-import-resolver-typescript@^4 &lt;span class="se"&gt;\&lt;/span&gt;
  eslint-plugin-import@^2.31 &lt;span class="se"&gt;\&lt;/span&gt;
  eslint-plugin-jsx-a11y@^6.10 &lt;span class="se"&gt;\&lt;/span&gt;
  eslint-plugin-react@^7.35 &lt;span class="se"&gt;\&lt;/span&gt;
  eslint-plugin-react-hooks@^5 &lt;span class="se"&gt;\&lt;/span&gt;
  prettier@^3 &lt;span class="se"&gt;\&lt;/span&gt;
  typescript@^5.8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. ESLint Setup
&lt;/h3&gt;

&lt;p&gt;In your &lt;code&gt;eslint.config.js&lt;/code&gt;, import and apply Mozayk configs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;mozaykBaseConfig&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@mozayk/eslint-config-base&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;mozaykTypeScriptConfig&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@mozayk/eslint-config-typescript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;mozaykReactConfig&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@mozayk/eslint-config-react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;typescriptParser&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@typescript-eslint/parser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;globals&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;globals&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/** @type {import("eslint").Linter.Config[]} */&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;mozaykBaseConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;mozaykTypeScriptConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;mozaykReactConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;languageOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;parser&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;typescriptParser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;parserOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;ecmaFeatures&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;jsx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;jsxPragma&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;sourceType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;module&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;projectService&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;es2022&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;React&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;writable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;JSX&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;readonly&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Your custom rules here&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adjust configs as needed depending on project specifics.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Prettier Setup
&lt;/h3&gt;

&lt;p&gt;In &lt;code&gt;prettier.config.js&lt;/code&gt;, import Mozayk Prettier config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;mozaykPrettierConfig&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@mozayk/prettier-config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/** @type {import("prettier").Config} */&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;mozaykPrettierConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;// Your custom rules here&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add scripts to package.json for easy linting and formatting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eslint . --max-warnings=0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"format"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prettier . --write"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Feedback &amp;amp; Community
&lt;/h2&gt;

&lt;p&gt;Mozayk TypeScript Style Guide was built to streamline development, minimize arguments and ensure high-quality, consistent code. It's open-source under the MIT license and available on &lt;a href="https://github.com/mozayk/typescript-style-guide" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. Your feedback helps to improve it, so give it a try and share your thoughts!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>react</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
