<?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: Srashti Gupta</title>
    <description>The latest articles on DEV Community by Srashti Gupta (@srashtigupta).</description>
    <link>https://dev.to/srashtigupta</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2879088%2F1a1681a4-bb10-43c2-bcf7-3f31eb49a6f0.jpg</url>
      <title>DEV Community: Srashti Gupta</title>
      <link>https://dev.to/srashtigupta</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/srashtigupta"/>
    <language>en</language>
    <item>
      <title>DPoP Explained: Making Stolen Access Tokens Useless</title>
      <dc:creator>Srashti Gupta</dc:creator>
      <pubDate>Wed, 10 Jun 2026 06:12:28 +0000</pubDate>
      <link>https://dev.to/srashtigupta/dpop-explained-making-stolen-access-tokens-useless-2nf7</link>
      <guid>https://dev.to/srashtigupta/dpop-explained-making-stolen-access-tokens-useless-2nf7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Ever had this happen?&lt;/strong&gt; Someone grabs your access token from the network tab, a log, or a leaked header — pastes it straight into Postman — and your API answers them like nothing's wrong. If that scenario makes you nervous, this post is for you.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A normal access token is a &lt;strong&gt;bearer token&lt;/strong&gt; — like cash. Whoever holds it can spend it. Steal it from a log, an XSS bug, or a leaky proxy, and the thief is in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DPoP&lt;/strong&gt; ties the token to a private key only your client has. Now a stolen token alone is worthless — the attacker would also need the key, and the key never leaves the client.&lt;/p&gt;

&lt;p&gt;One thing to be clear about up front: DPoP doesn't &lt;em&gt;stop&lt;/em&gt; people from calling your API (that's rate limiting / WAF territory). It makes a &lt;strong&gt;leaked token un-replayable&lt;/strong&gt;. That's the whole job — and for high-value or regulated APIs, it's a big one.&lt;/p&gt;

&lt;p&gt;Spec: &lt;a href="https://datatracker.ietf.org/doc/html/rfc9449" rel="noopener noreferrer"&gt;RFC 9449&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A normal OAuth 2.0 access token is a &lt;strong&gt;bearer token&lt;/strong&gt;. The name is the whole story: whoever &lt;em&gt;bears&lt;/em&gt; it can use it. The server does not check &lt;em&gt;who&lt;/em&gt; is presenting the token — only that the token is valid.&lt;/p&gt;

&lt;p&gt;That means a token is exactly like a $100 bill. If it falls out of your pocket and a stranger picks it up, it spends just as well for them as it did for you.&lt;/p&gt;

&lt;p&gt;In an API, tokens "fall out of your pocket" more often than you'd think:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An XSS bug reads the token out of &lt;code&gt;localStorage&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A token ends up in a log line, an error report, or an analytics payload.&lt;/li&gt;
&lt;li&gt;A misconfigured proxy or a leaky third-party SDK forwards the &lt;code&gt;Authorization&lt;/code&gt; header somewhere it shouldn't go.&lt;/li&gt;
&lt;li&gt;A token sits in browser history or a shared device.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once an attacker has the token, they replay it from their own machine and your server happily serves them, because the token &lt;em&gt;is&lt;/em&gt; valid.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DPoP fixes this specific problem.&lt;/strong&gt; It does &lt;strong&gt;not&lt;/strong&gt; stop someone from hitting your endpoints (that's what rate limiting, WAFs, and authn at the edge are for). What it does is make a &lt;em&gt;stolen&lt;/em&gt; token worthless to anyone except the client that originally requested it. So if you adopted it "to stop hackers calling your APIs," the precise framing is: &lt;em&gt;a leaked token can no longer be replayed by an attacker.&lt;/em&gt; That's a big deal for high-value or regulated APIs — anything where forged calls at scale would be expensive or dangerous.&lt;/p&gt;

&lt;p&gt;DPoP — &lt;strong&gt;D&lt;/strong&gt;emonstrating &lt;strong&gt;P&lt;/strong&gt;roof &lt;strong&gt;o&lt;/strong&gt;f &lt;strong&gt;P&lt;/strong&gt;ossession — is standardized in &lt;a href="https://datatracker.ietf.org/doc/html/rfc9449" rel="noopener noreferrer"&gt;RFC 9449&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The core idea in one sentence
&lt;/h2&gt;

&lt;p&gt;The client proves, on &lt;strong&gt;every single request&lt;/strong&gt;, that it holds the &lt;strong&gt;private key&lt;/strong&gt; that the token was bound to at the moment it was issued.&lt;/p&gt;

&lt;p&gt;A stolen token without the matching private key is useless. To replay it, an attacker would need the token &lt;em&gt;and&lt;/em&gt; the private key — and the private key never leaves the client (and, done right, can't be exported at all).&lt;/p&gt;




&lt;h2&gt;
  
  
  How it works: the moving parts
&lt;/h2&gt;

&lt;p&gt;DPoP introduces three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A client-held key pair.&lt;/strong&gt; The client generates an asymmetric key pair (commonly &lt;code&gt;ES256&lt;/code&gt;). The private key stays on the client; the public key gets embedded in proofs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A DPoP proof JWT.&lt;/strong&gt; A short-lived, single-use JWT, signed with the private key, sent in a &lt;code&gt;DPoP&lt;/code&gt; header on each request. It says "this request, this method, this URL, right now."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A binding on the token.&lt;/strong&gt; When the token is issued, the authorization server records a &lt;strong&gt;thumbprint&lt;/strong&gt; of the client's public key inside the token (the &lt;code&gt;cnf.jkt&lt;/code&gt; claim). Every later request must present a proof signed by the matching private key.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  What a DPoP proof actually looks like
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;header&lt;/strong&gt; identifies it as a DPoP proof and carries the public key:&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;"typ"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dpop+jwt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"alg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ES256"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jwk"&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;"kty"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"crv"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"P-256"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"x"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"l8tFrhx-34tV3hRICRDY9zCkDlpBhF42UQUfWVAWBFs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"y"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"9VE4jf_Ok_o64zbTTlcuNJajHmt6v9TDVrU0CdvGRDA"&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;p&gt;The &lt;strong&gt;payload&lt;/strong&gt; describes the request it's bound to:&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;"jti"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"f1d9c0a2-7b3e-4c1a-9e2f-1c2b3a4d5e6f"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"htm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"POST"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"htu"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.securestrip.example/v1/verify"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"iat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1718000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fUHyO2r2Z3DZ53EsNrWBb0xWXoaNy59IiKCAqksmQEo"&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;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Claim&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jti&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unique ID for this proof — used for &lt;strong&gt;replay detection&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;htm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;HTTP &lt;strong&gt;method&lt;/strong&gt; this proof is valid for&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;htu&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;HTTP &lt;strong&gt;target URI&lt;/strong&gt; (scheme + host + path, &lt;strong&gt;no query/fragment&lt;/strong&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;iat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Issued-at — proofs are only accepted within a small time window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ath&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;base64url(SHA-256(access_token))&lt;/code&gt; — ties the proof to a &lt;em&gt;specific&lt;/em&gt; token (required when calling a resource server)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nonce&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A server-supplied value, when the server demands one (more below)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The token binding (&lt;code&gt;cnf.jkt&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;When the authorization server issues a DPoP-bound access token, it computes the &lt;a href="https://datatracker.ietf.org/doc/html/rfc7638" rel="noopener noreferrer"&gt;JWK SHA-256 thumbprint&lt;/a&gt; of the client's public key and stamps it into the token:&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;"sub"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"device-7741"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"iss"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://auth.securestrip.example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"aud"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.securestrip.example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1718003600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cnf"&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;"jkt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0ZcOCORZNYy-DWpqq30jZyJGHTN0d2HglBV3uiguA4I"&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;p&gt;&lt;code&gt;cnf&lt;/code&gt; = "confirmation", &lt;code&gt;jkt&lt;/code&gt; = "JWK thumbprint." This is the anchor. The resource server later recomputes the thumbprint from the proof's embedded &lt;code&gt;jwk&lt;/code&gt; and checks it equals &lt;code&gt;cnf.jkt&lt;/code&gt;. Match = the caller holds the right key. No match = rejected.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For &lt;strong&gt;opaque&lt;/strong&gt; access tokens, the AS stores the binding server-side and returns the &lt;code&gt;jkt&lt;/code&gt; via token introspection instead of putting it in the token.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  One more change: the scheme is &lt;code&gt;DPoP&lt;/code&gt;, not &lt;code&gt;Bearer&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A DPoP-bound token is presented like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;GET&lt;/span&gt; &lt;span class="nn"&gt;/v1/verify&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api.securestrip.example&lt;/span&gt;
&lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DPoP eyJhbGciOiJSUzI1NiIsInR5cCI6...   &amp;lt;-- the access token&lt;/span&gt;
&lt;span class="na"&gt;DPoP&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;eyJ0eXAiOiJkcG9wK2p3dCIsImFsZ...                &amp;lt;-- the fresh proof JWT&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two headers: the token (&lt;code&gt;Authorization: DPoP ...&lt;/code&gt;) and a freshly minted proof (&lt;code&gt;DPoP: ...&lt;/code&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  The full flow, end to end
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────┐         1. token request + DPoP proof (key A)         ┌──────────────┐
│ Client │  ───────────────────────────────────────────────────▶ │ Authz Server │
│  (key  │                                                        │              │
│   pair)│ ◀───────────────────────────────────────────────────  │              │
└────────┘    2. access token with cnf.jkt = thumbprint(key A)    └──────────────┘
     │
     │  3. resource request
     │     Authorization: DPoP &amp;lt;token&amp;gt;
     │     DPoP: &amp;lt;proof signed by key A, with ath = hash(token)&amp;gt;
     ▼
┌──────────────────┐
│ Resource Server  │  4. verify proof signature, htm/htu, iat,
│                  │     jti not seen, thumbprint(jwk) == token.cnf.jkt,
│                  │     ath == hash(token)  →  serve or reject
└──────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The magic is step 4's thumbprint check: it links the &lt;em&gt;live request&lt;/em&gt; back to the &lt;em&gt;key the token was issued for&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The "how": code
&lt;/h2&gt;

&lt;p&gt;I'll use Node and &lt;a href="https://github.com/panva/jose" rel="noopener noreferrer"&gt;&lt;code&gt;jose&lt;/code&gt;&lt;/a&gt;, but the concepts map to any language.&lt;/p&gt;

&lt;h3&gt;
  
  
  Client — create and reuse a key pair
&lt;/h3&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;generateKeyPair&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;exportJWK&lt;/span&gt; &lt;span class="p"&gt;}&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;jose&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Generate ONCE per session and keep it for the session's lifetime.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;publicKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;privateKey&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;generateKeyPair&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ES256&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;publicJwk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;exportJWK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;publicKey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;In the browser, generate the key with the &lt;strong&gt;WebCrypto API&lt;/strong&gt; and mark it &lt;code&gt;extractable: false&lt;/code&gt;. The private key then physically cannot be read out by JavaScript — even an XSS payload can &lt;em&gt;ask&lt;/em&gt; it to sign, but can't steal the key itself. That's the single most important hardening step on the client.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Client — build a proof for each request
&lt;/h3&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SignJWT&lt;/span&gt; &lt;span class="p"&gt;}&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;jose&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createHash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;randomUUID&lt;/span&gt; &lt;span class="p"&gt;}&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;node:crypto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;base64url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;base64&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\+&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;_&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/=+$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;accessToken&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="nf"&gt;base64url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;createHash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sha256&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;accessToken&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;digest&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createDpopProof&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;htm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;htu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;accessToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;nonce&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;htm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;htu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;jti&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;accessToken&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;accessToken&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// required at the resource server&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nonce&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                &lt;span class="c1"&gt;// when the server demands one&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SignJWT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setProtectedHeader&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;typ&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dpop+jwt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;alg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ES256&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;jwk&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;publicJwk&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setIssuedAt&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;privateKey&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;h3&gt;
  
  
  Client — call the API
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;htu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.securestrip.example/v1/verify&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// no query string!&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;proof&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createDpopProof&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;htm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;htu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;accessToken&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;htu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`DPoP &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;accessToken&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;DPoP&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;proof&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&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="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;stripId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;...&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Resource server — verify the proof
&lt;/h3&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;jwtVerify&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;importJWK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;calculateJwkThumbprint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;decodeProtectedHeader&lt;/span&gt; &lt;span class="p"&gt;}&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;jose&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createHash&lt;/span&gt; &lt;span class="p"&gt;}&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;node:crypto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// In production use Redis with a TTL, not an in-memory Set (see "Cases" below).&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;seenJti&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;base64url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;base64&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\+&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;-&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;_&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/=+$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;base64url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;createHash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sha256&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;digest&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;verifyDpop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tokenClaims&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;proofJwt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dpop&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;proofJwt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;missing_dpop_proof&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// 1. Read the embedded public key from the header and verify the signature with it.&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;jwk&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;decodeProtectedHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;proofJwt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;importJWK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jwk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;jwk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;alg&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ES256&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;jwtVerify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;proofJwt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;typ&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dpop+jwt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// 2. Bind the proof to THIS request.&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;htm&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;method&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;htm_mismatch&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;htu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;://&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;host&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}${&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// no query string&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;htu&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;htu&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;htu_mismatch&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// 3. Freshness — small window; widen only if you can't sync clocks.&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;iat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;proof_expired&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// 4. Replay protection — each jti is single use.&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;seenJti&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;jti&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;replay_detected&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;seenJti&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;jti&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// 5. THE binding check — does the caller hold the key the token was issued for?&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;thumbprint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;calculateJwkThumbprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;jwk&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;thumbprint&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;tokenClaims&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cnf&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;jkt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;token_not_bound_to_key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// 6. Tie proof to THIS token.&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;presentedToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ath&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nf"&gt;ath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;presentedToken&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ath_mismatch&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the entire mechanism. Six checks, one of which (step 5) is the actual sender-constraining magic; the rest stop tampering and replay.&lt;/p&gt;




&lt;h2&gt;
  
  
  The "all the cases" part: what production actually throws at you
&lt;/h2&gt;

&lt;p&gt;A toy implementation handles the happy path. A real one has to handle these.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case 1 — Binding at the token endpoint (issuance)
&lt;/h3&gt;

&lt;p&gt;The client sends a DPoP proof to the &lt;strong&gt;token endpoint&lt;/strong&gt; (&lt;code&gt;htu&lt;/code&gt; = the token URL). The AS reads the &lt;code&gt;jwk&lt;/code&gt;, computes the thumbprint, and stamps &lt;code&gt;cnf.jkt&lt;/code&gt; into the issued access token. No proof here ⇒ no binding ⇒ you've gained nothing. This is the root of trust.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case 2 — Calling a protected resource
&lt;/h3&gt;

&lt;p&gt;Covered above. Key point: the proof here &lt;strong&gt;must&lt;/strong&gt; include &lt;code&gt;ath&lt;/code&gt; (the hash of the token). Without it, an attacker who captured a valid proof for endpoint X could pair it with a &lt;em&gt;different&lt;/em&gt; stolen token. &lt;code&gt;ath&lt;/code&gt; welds proof and token together.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case 3 — Refresh tokens must be bound too
&lt;/h3&gt;

&lt;p&gt;For &lt;strong&gt;public clients&lt;/strong&gt; (SPAs, mobile, native), the refresh token is also sender-constrained. The client sends a proof (with the &lt;em&gt;same&lt;/em&gt; key) on every refresh call. This matters enormously: a stolen refresh token is a long-lived skeleton key. DPoP-binding it means a leaked refresh token can't be redeemed by an attacker either.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case 4 — Server-supplied nonce (the strongest replay defense)
&lt;/h3&gt;

&lt;p&gt;Relying only on &lt;code&gt;iat&lt;/code&gt; + &lt;code&gt;jti&lt;/code&gt; means an attacker who grabs a fresh proof has a few-second replay window. To close it, the server can demand a &lt;strong&gt;nonce&lt;/strong&gt; it controls.&lt;/p&gt;

&lt;p&gt;Server, when it wants a nonce:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;401&lt;/span&gt; &lt;span class="ne"&gt;Unauthorized&lt;/span&gt;
&lt;span class="na"&gt;WWW-Authenticate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DPoP error="use_dpop_nonce", error_description="nonce required"&lt;/span&gt;
&lt;span class="na"&gt;DPoP-Nonce&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;eyJ7S_zG.bC8...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The client reads &lt;code&gt;DPoP-Nonce&lt;/code&gt;, rebuilds the proof &lt;strong&gt;with&lt;/strong&gt; that &lt;code&gt;nonce&lt;/code&gt; claim, and retries. Because the server issued the nonce (typically short-lived and single-use), proofs can't be pre-generated or replayed beyond it.&lt;/p&gt;

&lt;p&gt;Client retry logic:&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="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;callApi&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;401&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nf"&gt;wantsNonce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nonce&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DPoP-Nonce&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;callApi&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;nonce&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="c1"&gt;// one retry with the fresh nonce&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Build this retry loop from day one — many DPoP servers rotate nonces and will hand you a new one on responses, expecting it on the &lt;em&gt;next&lt;/em&gt; call.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case 5 — Replay protection at scale (&lt;code&gt;jti&lt;/code&gt; store)
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;seenJti&lt;/code&gt; &lt;code&gt;Set&lt;/code&gt; above leaks memory and doesn't work across instances. In production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store each &lt;code&gt;jti&lt;/code&gt; in &lt;strong&gt;Redis&lt;/strong&gt; with a TTL equal to your accepted &lt;code&gt;iat&lt;/code&gt; window (e.g. 60s). After that the proof is too old to replay anyway, so you can forget the &lt;code&gt;jti&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Behind a load balancer, &lt;strong&gt;all&lt;/strong&gt; API instances must share that store — otherwise a proof replayed against a different instance won't be caught.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`dpop:jti:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;jti&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EX&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;NX&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;replay_detected&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// NX failed ⇒ already seen&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Case 6 — Clock skew and the &lt;code&gt;iat&lt;/code&gt; window
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;iat&lt;/code&gt; is checked against server time. Mobile devices and browsers drift. Options, best to worst:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Require a &lt;strong&gt;nonce&lt;/strong&gt; (Case 4) — then exact clock sync barely matters.&lt;/li&gt;
&lt;li&gt;Allow a small symmetric skew (±30–60s).&lt;/li&gt;
&lt;li&gt;Don't be tempted to widen the window to minutes — that's a bigger replay surface.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Case 7 — Key rotation mid-session
&lt;/h3&gt;

&lt;p&gt;If the client rotates its key, the old token's &lt;code&gt;cnf.jkt&lt;/code&gt; no longer matches. The client must obtain a &lt;strong&gt;new&lt;/strong&gt; token bound to the new key (e.g. via a DPoP-bound refresh). Plan for "rotate key ⇒ re-bind tokens," and don't rotate more often than your token lifetime needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case 8 — Multiple resource servers
&lt;/h3&gt;

&lt;p&gt;Each resource server validates independently. &lt;code&gt;htu&lt;/code&gt; differs per server, and each recomputes the thumbprint against the token's &lt;code&gt;cnf.jkt&lt;/code&gt;. The same key pair works across all of them — the client just mints a fresh proof per request with the correct &lt;code&gt;htm&lt;/code&gt;/&lt;code&gt;htu&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case 9 — Opaque tokens
&lt;/h3&gt;

&lt;p&gt;No &lt;code&gt;cnf&lt;/code&gt; claim to read locally. The resource server calls the AS &lt;strong&gt;introspection&lt;/strong&gt; endpoint, which returns the bound &lt;code&gt;jkt&lt;/code&gt;. Same thumbprint comparison, the binding just arrives via introspection instead of a JWT claim.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case 10 — Proxies, TLS termination, and &lt;code&gt;htu&lt;/code&gt; mismatches
&lt;/h3&gt;

&lt;p&gt;The #1 real-world bug: your app sees &lt;code&gt;http://internal-host/path&lt;/code&gt; while the client signed &lt;code&gt;https://api.public.example/path&lt;/code&gt;. Then &lt;code&gt;htu&lt;/code&gt; never matches and every request 401s.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set &lt;code&gt;app.set('trust proxy', true)&lt;/code&gt; (Express) so &lt;code&gt;req.protocol&lt;/code&gt;/&lt;code&gt;req.get('host')&lt;/code&gt; reflect the public URL.&lt;/li&gt;
&lt;li&gt;Normalize &lt;code&gt;htu&lt;/code&gt; consistently on both sides: scheme + authority + path, &lt;strong&gt;lowercased scheme/host, no default port, no query, no fragment&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Case 11 — Error responses your client must understand
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;&lt;code&gt;error&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Proof malformed / signature bad / &lt;code&gt;htm&lt;/code&gt;/&lt;code&gt;htu&lt;/code&gt;/&lt;code&gt;iat&lt;/code&gt; wrong&lt;/td&gt;
&lt;td&gt;401&lt;/td&gt;
&lt;td&gt;&lt;code&gt;invalid_dpop_proof&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server requires a nonce&lt;/td&gt;
&lt;td&gt;401&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;use_dpop_nonce&lt;/code&gt; (+ &lt;code&gt;DPoP-Nonce&lt;/code&gt; header)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token not bound to presented key&lt;/td&gt;
&lt;td&gt;401&lt;/td&gt;
&lt;td&gt;&lt;code&gt;invalid_token&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Your client should retry exactly once on &lt;code&gt;use_dpop_nonce&lt;/code&gt; and surface the rest as auth failures.&lt;/p&gt;




&lt;h2&gt;
  
  
  The "when": should you actually use DPoP?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Reach for DPoP when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have &lt;strong&gt;public clients&lt;/strong&gt; — SPAs, mobile apps, native apps — that can't keep a secret and where mTLS is impractical. This is the headline use case.&lt;/li&gt;
&lt;li&gt;Your API is &lt;strong&gt;high-value or regulated&lt;/strong&gt; — payments, health, identity, anti-counterfeit verification — where a replayed token causes real damage. (If a leaked token would let someone forge "this product is genuine" calls at scale, DPoP is squarely the right tool.)&lt;/li&gt;
&lt;li&gt;You want &lt;strong&gt;defense in depth&lt;/strong&gt; alongside short token lifetimes and good edge controls.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;DPoP vs mTLS (RFC 8705):&lt;/strong&gt; both &lt;em&gt;sender-constrain&lt;/em&gt; tokens. mTLS does it at the transport layer with client certificates and needs a PKI — excellent for confidential &lt;strong&gt;server-to-server&lt;/strong&gt; clients, painful for browsers and mobile. DPoP does it at the application layer with no PKI — built precisely for public clients. Many architectures use mTLS between back-end services and DPoP for user-facing apps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You probably don't need it when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's pure server-to-server traffic where mTLS is already in place.&lt;/li&gt;
&lt;li&gt;The endpoints are low-risk and a leaked token is cheap to revoke.&lt;/li&gt;
&lt;li&gt;You can't yet afford the operational pieces below — in which case ship short token lifetimes + rotation first, then add DPoP.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What DPoP does &lt;strong&gt;not&lt;/strong&gt; solve (set expectations honestly)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It is not a WAF or rate limiter.&lt;/strong&gt; It doesn't stop traffic, block IPs, or throttle abuse. It makes &lt;em&gt;stolen tokens&lt;/em&gt; unusable — that's the entire scope.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It doesn't save you from a fully compromised client.&lt;/strong&gt; If an attacker is running inside your page/app with access to the signing key, they can sign valid proofs while they're there. Non-extractable keys limit them to &lt;em&gt;while present&lt;/em&gt; (they can't exfiltrate the key for later/offline use), but they don't make a compromised client safe. Fix the XSS too.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It binds to a key, not to a TLS channel.&lt;/strong&gt; That's by design — it's why it works for public clients — but it means transport-level guarantees still matter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It adds moving parts:&lt;/strong&gt; key lifecycle, a shared replay store, nonce handling, clock tolerance, and &lt;code&gt;htu&lt;/code&gt; normalization behind proxies. Budget for those.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  A pragmatic rollout checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Generate a &lt;strong&gt;non-extractable&lt;/strong&gt; key pair per session (WebCrypto in browsers).&lt;/li&gt;
&lt;li&gt;Bind tokens at the &lt;strong&gt;token endpoint&lt;/strong&gt; and bind &lt;strong&gt;refresh tokens&lt;/strong&gt; for public clients.&lt;/li&gt;
&lt;li&gt;Send &lt;code&gt;Authorization: DPoP &amp;lt;token&amp;gt;&lt;/code&gt; + a fresh &lt;code&gt;DPoP:&lt;/code&gt; proof on every call; include &lt;code&gt;ath&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;On the server, verify: signature, &lt;code&gt;typ&lt;/code&gt;, &lt;code&gt;htm&lt;/code&gt;, &lt;code&gt;htu&lt;/code&gt;, &lt;code&gt;iat&lt;/code&gt; window, &lt;code&gt;jti&lt;/code&gt; (shared store), &lt;code&gt;cnf.jkt&lt;/code&gt; thumbprint, &lt;code&gt;ath&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Implement the &lt;strong&gt;&lt;code&gt;use_dpop_nonce&lt;/code&gt;&lt;/strong&gt; 401 retry on the client and issue/rotate nonces on the server.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Redis&lt;/strong&gt; (or equivalent) for &lt;code&gt;jti&lt;/code&gt;/nonce state, shared across all API instances.&lt;/li&gt;
&lt;li&gt;Set &lt;strong&gt;&lt;code&gt;trust proxy&lt;/code&gt;&lt;/strong&gt; and normalize &lt;code&gt;htu&lt;/code&gt; so it survives TLS termination.&lt;/li&gt;
&lt;li&gt;Keep token lifetimes short — DPoP is a complement to rotation, not a replacement.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;Bearer tokens trust &lt;em&gt;possession&lt;/em&gt;. DPoP upgrades that to &lt;em&gt;proof of possession&lt;/em&gt;: every request carries a fresh, signed challenge proving the caller still holds the private key the token was minted for. Steal the token, and without the key it's a coupon you can't redeem.&lt;/p&gt;

&lt;p&gt;It won't keep attackers from knocking on your door — but it makes sure that when they do, the keys they picked up off the floor don't open anything.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Spec: &lt;a href="https://datatracker.ietf.org/doc/html/rfc9449" rel="noopener noreferrer"&gt;RFC 9449 — OAuth 2.0 Demonstrating Proof of Possession (DPoP)&lt;/a&gt;. Thumbprints: &lt;a href="https://datatracker.ietf.org/doc/html/rfc7638" rel="noopener noreferrer"&gt;RFC 7638&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>oauth</category>
      <category>node</category>
      <category>api</category>
    </item>
    <item>
      <title>How CNNs Learn to See: A Beginner-Friendly Guide</title>
      <dc:creator>Srashti Gupta</dc:creator>
      <pubDate>Tue, 26 May 2026 09:57:00 +0000</pubDate>
      <link>https://dev.to/srashtigupta/how-cnns-learn-to-see-a-beginner-friendly-guide-kd4</link>
      <guid>https://dev.to/srashtigupta/how-cnns-learn-to-see-a-beginner-friendly-guide-kd4</guid>
      <description>&lt;p&gt;Humans don’t inspect every pixel of an image. We notice edges, colors, and shapes quickly.&lt;br&gt;
A &lt;strong&gt;Convolutional Neural Network (CNN)&lt;/strong&gt; works similarly.&lt;/p&gt;

&lt;p&gt;This guide explains CNNs in simple terms using a &lt;strong&gt;cat photo&lt;/strong&gt; example.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is a CNN?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;CNN (Convolutional Neural Network)&lt;/strong&gt; is a deep learning model built for image data.&lt;/p&gt;

&lt;p&gt;It learns visual patterns like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;edges&lt;/li&gt;
&lt;li&gt;corners&lt;/li&gt;
&lt;li&gt;textures&lt;/li&gt;
&lt;li&gt;object shapes&lt;/li&gt;
&lt;li&gt;spatial relationships&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why not use a normal neural network?
&lt;/h2&gt;

&lt;p&gt;A fully connected network can take image pixels as input, but it has issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;treats each pixel as independent
&lt;/li&gt;
&lt;li&gt;ignores local pixel relationships
&lt;/li&gt;
&lt;li&gt;uses many parameters
&lt;/li&gt;
&lt;li&gt;struggles when object position changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hence, CNNs are preferred for image tasks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why CNNs are better for images
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1) Local pattern detection
&lt;/h3&gt;

&lt;p&gt;CNN scans the image in small patches with filters, first detecting simple patterns like edges.&lt;/p&gt;

&lt;h3&gt;
  
  
  2) Position robustness
&lt;/h3&gt;

&lt;p&gt;A cat shifted left/right/up/down or slightly rotated is still recognized.&lt;/p&gt;

&lt;h3&gt;
  
  
  3) Efficient learning
&lt;/h3&gt;

&lt;p&gt;The same filters are reused across the whole image, improving learning efficiency.&lt;/p&gt;




&lt;h2&gt;
  
  
  CNN architecture (simple flow)
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Input Image → Convolution → ReLU → Pooling → (repeat) → Flatten → Fully Connected → Softmax&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Cat example, step by step
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Convolution
&lt;/h3&gt;

&lt;p&gt;Low-level layers detect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ear boundary&lt;/li&gt;
&lt;li&gt;whisker lines&lt;/li&gt;
&lt;li&gt;fur texture&lt;/li&gt;
&lt;li&gt;eye-edge contrast&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2: ReLU
&lt;/h3&gt;

&lt;p&gt;ReLU keeps positive activations and removes negatives.&lt;/p&gt;

&lt;p&gt;Example: &lt;code&gt;[-3, 4, -1, 8] → [0, 4, 0, 8]&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Pooling
&lt;/h3&gt;

&lt;p&gt;Max pooling keeps strongest signals and compresses data.&lt;/p&gt;

&lt;p&gt;Example 2×2 block: &lt;code&gt;[2, 6, 1, 4] → 6&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Deeper layers
&lt;/h3&gt;

&lt;p&gt;Later layers detect bigger features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cat ears shape
&lt;/li&gt;
&lt;li&gt;two eyes + nose location
&lt;/li&gt;
&lt;li&gt;body silhouette
&lt;/li&gt;
&lt;li&gt;cat on table pattern&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now the model understands “cat-like” structure, not just edges.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Fully connected + Softmax
&lt;/h3&gt;

&lt;p&gt;Flattened features are combined and final probabilities are produced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cat: 0.94
&lt;/li&gt;
&lt;li&gt;Dog: 0.03
&lt;/li&gt;
&lt;li&gt;Rabbit: 0.01
&lt;/li&gt;
&lt;li&gt;Sofa: 0.01
&lt;/li&gt;
&lt;li&gt;Chair: 0.01&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prediction: &lt;strong&gt;Cat (94%)&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Tips to improve CNN performance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Batch Normalization&lt;/strong&gt;: stabilizes training
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dropout&lt;/strong&gt;: reduces overfitting
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Augmentation&lt;/strong&gt;: rotate, flip, crop, brightness change
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transfer Learning&lt;/strong&gt;: fine-tune pre-trained models (MobileNet, ResNet, EfficientNet)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common applications
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;image classification&lt;/li&gt;
&lt;li&gt;face recognition&lt;/li&gt;
&lt;li&gt;object detection (YOLO, Faster R-CNN)&lt;/li&gt;
&lt;li&gt;medical image analysis&lt;/li&gt;
&lt;li&gt;handwritten digit recognition (MNIST)&lt;/li&gt;
&lt;li&gt;license plate detection&lt;/li&gt;
&lt;li&gt;surveillance and retail systems&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;CNNs work so well with images because they learn hierarchically:&lt;br&gt;
&lt;strong&gt;edges → shapes → parts → complete object&lt;/strong&gt;.&lt;/p&gt;




</description>
      <category>machinelearning</category>
      <category>deeplearning</category>
      <category>ai</category>
      <category>computervision</category>
    </item>
    <item>
      <title>Observability vs Monitoring: What Every Developer Must Know</title>
      <dc:creator>Srashti Gupta</dc:creator>
      <pubDate>Thu, 19 Feb 2026 11:11:28 +0000</pubDate>
      <link>https://dev.to/srashtigupta/observability-vs-monitoring-what-every-developer-must-know-42lg</link>
      <guid>https://dev.to/srashtigupta/observability-vs-monitoring-what-every-developer-must-know-42lg</guid>
      <description>&lt;h2&gt;
  
  
  Observability Explained for Backend Engineers
&lt;/h2&gt;

&lt;p&gt;Modern systems are no longer single applications running on one server.&lt;br&gt;
They are distributed, containerized, and highly dynamic.&lt;/p&gt;

&lt;p&gt;When something breaks in production, how do we find the root cause?&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;observability&lt;/strong&gt; comes in.&lt;/p&gt;


&lt;h2&gt;
  
  
  What is Observability?
&lt;/h2&gt;

&lt;p&gt;Observability is the ability to understand the internal state of a system by analyzing its outputs.&lt;/p&gt;

&lt;p&gt;In simple words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can we detect, debug, and fix production issues without logging into the server?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If yes — your system is observable.&lt;/p&gt;


&lt;h2&gt;
  
  
  🏗 The Three Pillars of Observability
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Metrics
&lt;/h3&gt;

&lt;p&gt;Metrics are numerical values over time.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU usage&lt;/li&gt;
&lt;li&gt;Memory usage&lt;/li&gt;
&lt;li&gt;Request per second&lt;/li&gt;
&lt;li&gt;Error rate&lt;/li&gt;
&lt;li&gt;Latency (p95, p99)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Common tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prometheus&lt;/li&gt;
&lt;li&gt;Datadog&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Logs
&lt;/h3&gt;

&lt;p&gt;Logs are event-based records that provide detailed information.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Payment failed due to database timeout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Popular stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Elasticsearch&lt;/li&gt;
&lt;li&gt;Logstash&lt;/li&gt;
&lt;li&gt;Kibana&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(Also known as ELK stack)&lt;/p&gt;




&lt;h3&gt;
  
  
  Traces
&lt;/h3&gt;

&lt;p&gt;Traces track a single request across multiple services.&lt;/p&gt;

&lt;p&gt;Example request flow:&lt;/p&gt;

&lt;p&gt;User → API Gateway → Auth Service → Payment Service → Database → Response&lt;/p&gt;

&lt;p&gt;Tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jaeger&lt;/li&gt;
&lt;li&gt;Zipkin&lt;/li&gt;
&lt;li&gt;OpenTelemetry&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🖼 Observability Architecture
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopenobserve.ai%2Fassets%2Fmicroservices_observability_component_diagram_d11c18eb94.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopenobserve.ai%2Fassets%2Fmicroservices_observability_component_diagram_d11c18eb94.png" alt="Image" width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fek8ewribjbupuntifvhp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fek8ewribjbupuntifvhp.png" alt="Image" width="484" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkpoh0n08bcd42mpyhz3f.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkpoh0n08bcd42mpyhz3f.webp" alt="Image" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa1j3gxz6ohh4k4i5yupt.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa1j3gxz6ohh4k4i5yupt.webp" alt="Image" width="695" height="424"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚖ Observability vs Monitoring
&lt;/h2&gt;

&lt;p&gt;Monitoring answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Is the system healthy?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Observability answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Why is the system unhealthy?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Monitoring = Known issues&lt;br&gt;
Observability = Unknown issues&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Observability Matters in High-Traffic Systems
&lt;/h2&gt;

&lt;p&gt;Imagine your system traffic increases 10×.&lt;/p&gt;

&lt;p&gt;Suddenly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Latency increases&lt;/li&gt;
&lt;li&gt;Error rate spikes&lt;/li&gt;
&lt;li&gt;Users complain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without observability:&lt;br&gt;
You guess.&lt;/p&gt;

&lt;p&gt;With observability:&lt;br&gt;
You know.&lt;/p&gt;

&lt;p&gt;You can check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU saturation&lt;/li&gt;
&lt;li&gt;Database latency&lt;/li&gt;
&lt;li&gt;Cache hit ratio&lt;/li&gt;
&lt;li&gt;External API failures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This reduces Mean Time To Recovery (MTTR).&lt;/p&gt;




&lt;h2&gt;
  
  
  Advanced Concepts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SLI (Service Level Indicator)&lt;/li&gt;
&lt;li&gt;SLO (Service Level Objective)&lt;/li&gt;
&lt;li&gt;Error Budget&lt;/li&gt;
&lt;li&gt;Structured Logging&lt;/li&gt;
&lt;li&gt;Correlation IDs&lt;/li&gt;
&lt;li&gt;Distributed Context Propagation&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Observability is no longer optional.&lt;/p&gt;

&lt;p&gt;In modern microservices and cloud-native systems, it is essential.&lt;/p&gt;

&lt;p&gt;If you are building scalable backend systems, observability should be part of your design — not an afterthought.&lt;/p&gt;




</description>
      <category>observability</category>
      <category>microservices</category>
      <category>backend</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>WHY we use Mapped Types &amp;Conditional Types in TS?</title>
      <dc:creator>Srashti Gupta</dc:creator>
      <pubDate>Sun, 14 Dec 2025 09:54:47 +0000</pubDate>
      <link>https://dev.to/srashtigupta/why-we-use-mapped-types-conditional-types-in-ts-18ic</link>
      <guid>https://dev.to/srashtigupta/why-we-use-mapped-types-conditional-types-in-ts-18ic</guid>
      <description>&lt;h2&gt;
  
  
  We Use Mapped &amp;amp; Conditional Types in TypeScript (Real-World Examples)
&lt;/h2&gt;

&lt;p&gt;When building real applications, we rarely deal with &lt;strong&gt;static types&lt;/strong&gt;.&lt;br&gt;
Data changes based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API responses&lt;/li&gt;
&lt;li&gt;User roles&lt;/li&gt;
&lt;li&gt;Form states&lt;/li&gt;
&lt;li&gt;Backend validations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Mapped Types&lt;/strong&gt; and &lt;strong&gt;Conditional Types&lt;/strong&gt; help us &lt;strong&gt;reuse and transform existing types instead of rewriting them again and again&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let’s understand &lt;strong&gt;why they exist&lt;/strong&gt;, using &lt;strong&gt;simple real-world examples&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. Why Mapped Types?
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Problem (Real Life)
&lt;/h3&gt;

&lt;p&gt;You have a &lt;strong&gt;User model&lt;/strong&gt; coming from the backend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="na"&gt;isActive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now in real projects, you often need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;form version&lt;/strong&gt; (all fields optional)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;readonly version&lt;/strong&gt; (API response)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;preview version&lt;/strong&gt; (only some fields)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without mapped types ❌ you’d rewrite types manually — which is error-prone.&lt;/p&gt;




&lt;h3&gt;
  
  
  Solution: Mapped Types ✅
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Example 1: Form State (All Optional)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;UserForm&lt;/span&gt; &lt;span class="o"&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;K&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="kr"&gt;keyof&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;]?:&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;K&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;Now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding/removing fields in &lt;code&gt;User&lt;/code&gt; automatically updates &lt;code&gt;UserForm&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;No duplicate type maintenance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is exactly what &lt;code&gt;Partial&amp;lt;User&amp;gt;&lt;/code&gt; does internally.&lt;/p&gt;




&lt;h4&gt;
  
  
  Example 2: Read-Only API Response
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ReadonlyUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;K&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="kr"&gt;keyof&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;K&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;Why?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prevents accidental mutation of API data&lt;/li&gt;
&lt;li&gt;Very common in frontend apps&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  Example 3: Editable Fields Only
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;EditableUser&lt;/span&gt; &lt;span class="o"&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;K&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;K&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;Used when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only some fields are editable&lt;/li&gt;
&lt;li&gt;Others (like &lt;code&gt;id&lt;/code&gt;) should not be touched&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Why Conditional Types?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem (Real Life)
&lt;/h3&gt;

&lt;p&gt;Different APIs or functions return &lt;strong&gt;different data types based on input&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If user is &lt;code&gt;"admin"&lt;/code&gt; → return full access&lt;/li&gt;
&lt;li&gt;If user is &lt;code&gt;"guest"&lt;/code&gt; → limited access&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Solution: Conditional Types ✅
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Example 1: Role-Based Data
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Role&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Permissions&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;admin&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="na"&gt;canDelete&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="nl"&gt;canEdit&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="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;canDelete&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;canEdit&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;AdminPermissions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Permissions&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;UserPermissions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Permissions&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why this matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Type safety at compile time&lt;/li&gt;
&lt;li&gt;No runtime role mistakes&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  Example 2: API Response Type
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;success&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="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&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;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Success&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;success&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Failure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This matches how real APIs behave.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Why &lt;code&gt;infer&lt;/code&gt;? (Very Practical Example)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem
&lt;/h3&gt;

&lt;p&gt;You want to &lt;strong&gt;extract the data type&lt;/strong&gt; from an API function automatically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Srashti&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Manually writing types ❌ is repetitive.&lt;/p&gt;




&lt;h3&gt;
  
  
  Solution: &lt;code&gt;infer&lt;/code&gt; ✅
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ExtractReturn&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="nf"&gt;extends &lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;infer&lt;/span&gt; &lt;span class="nx"&gt;R&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;R&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;never&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;UserData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ExtractReturn&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;fetchUser&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why this is powerful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auto-syncs with function changes&lt;/li&gt;
&lt;li&gt;No manual updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is how &lt;code&gt;ReturnType&amp;lt;T&amp;gt;&lt;/code&gt; works internally.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Why Distributive Conditional Types?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem
&lt;/h3&gt;

&lt;p&gt;You have a &lt;strong&gt;union type&lt;/strong&gt; and want logic applied to each member.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ToArray&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;never&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ToArray&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// string[] | number[]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why this is useful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validating inputs&lt;/li&gt;
&lt;li&gt;Transforming API payloads&lt;/li&gt;
&lt;li&gt;Working with union types cleanly&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Real Use of Utility Types (Behind the Scenes)
&lt;/h2&gt;

&lt;p&gt;All of these are built using &lt;strong&gt;Mapped + Conditional Types&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nb"&gt;Partial&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nb"&gt;Pick&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;K&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nb"&gt;Omit&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;K&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nb"&gt;Exclude&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;U&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nb"&gt;Extract&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;U&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nb"&gt;ReturnType&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example from real apps:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;UpdateUserPayload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Omit&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Used when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backend auto-generates &lt;code&gt;id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Frontend shouldn’t send it&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Real-World Summary (Why We Actually Use Them)
&lt;/h2&gt;

&lt;p&gt;We use &lt;strong&gt;Mapped Types&lt;/strong&gt; when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One base model has multiple variations&lt;/li&gt;
&lt;li&gt;Forms, DTOs, API models differ slightly&lt;/li&gt;
&lt;li&gt;We want DRY (Don’t Repeat Yourself) types&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We use &lt;strong&gt;Conditional Types&lt;/strong&gt; when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Output type depends on input&lt;/li&gt;
&lt;li&gt;Role-based or state-based logic&lt;/li&gt;
&lt;li&gt;API responses vary&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Mapped Types and Conditional Types are not “advanced for no reason”.&lt;br&gt;
They exist because &lt;strong&gt;real applications are dynamic&lt;/strong&gt;, and TypeScript helps us model that &lt;strong&gt;safely and cleanly&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once you start using them, you’ll:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write fewer bugs&lt;/li&gt;
&lt;li&gt;Remove duplicate types&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  * Scale your codebase confidently
&lt;/h2&gt;




</description>
      <category>webdev</category>
      <category>typescript</category>
      <category>programming</category>
      <category>web</category>
    </item>
    <item>
      <title>Generating Millions of Unique IDs in TypeScript — Fast, Scalable &amp; Collision-Free</title>
      <dc:creator>Srashti Gupta</dc:creator>
      <pubDate>Sat, 08 Nov 2025 14:09:15 +0000</pubDate>
      <link>https://dev.to/srashtigupta/generating-millions-of-unique-ids-in-typescript-fast-scalable-collision-free-3ik3</link>
      <guid>https://dev.to/srashtigupta/generating-millions-of-unique-ids-in-typescript-fast-scalable-collision-free-3ik3</guid>
      <description>&lt;h3&gt;
  
  
  ✨ Why I Wrote This
&lt;/h3&gt;

&lt;p&gt;While scaling a backend service recently, I hit a challenge — generating &lt;strong&gt;billions of unique IDs&lt;/strong&gt; efficiently, without collisions, and without blowing up memory.&lt;br&gt;
UUIDs were too long, and auto-increment IDs broke under distributed systems.&lt;/p&gt;

&lt;p&gt;That’s when I explored &lt;strong&gt;Snowflake algorithms&lt;/strong&gt; and combined them with &lt;strong&gt;Base62 encoding&lt;/strong&gt; — producing &lt;strong&gt;short, globally unique IDs&lt;/strong&gt; that can be generated in &lt;strong&gt;crores per minute&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here’s what I learned 👇&lt;/p&gt;


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

&lt;p&gt;Ever wondered how &lt;strong&gt;Twitter&lt;/strong&gt;, &lt;strong&gt;YouTube&lt;/strong&gt;, or &lt;strong&gt;TikTok&lt;/strong&gt; generate &lt;em&gt;billions of unique IDs&lt;/em&gt; every day — instantly and safely?&lt;/p&gt;

&lt;p&gt;Traditional methods like &lt;code&gt;UUID&lt;/code&gt; or &lt;code&gt;AUTO_INCREMENT&lt;/code&gt; are not scalable across distributed databases.&lt;br&gt;
As systems grow, we need an ID generator that’s:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡ &lt;strong&gt;Fast&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🧠 &lt;strong&gt;Memory-efficient&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🧩 &lt;strong&gt;Collision-free&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🔢 &lt;strong&gt;Compact &amp;amp; Sortable&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s explore how to build one — and even generate &lt;strong&gt;crores of unique IDs in seconds&lt;/strong&gt; using &lt;strong&gt;TypeScript&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  🧠 2. Key Requirements for a Scalable ID Generator
&lt;/h3&gt;

&lt;p&gt;An ideal ID generator should be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unique&lt;/strong&gt; — zero collision risk&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sortable&lt;/strong&gt; — time-based for sequencing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast&lt;/strong&gt; — able to generate millions/sec&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compact&lt;/strong&gt; — fixed length (~13 chars)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible&lt;/strong&gt; — predictable or opaque&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  ⚙️ 3. Popular Approaches
&lt;/h3&gt;
&lt;h4&gt;
  
  
  a) &lt;strong&gt;UUID / NanoID&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;✅ Simple, plug-and-play&lt;/li&gt;
&lt;li&gt;❌ Not sortable&lt;/li&gt;
&lt;li&gt;❌ UUIDv4 = 36 chars long&lt;/li&gt;
&lt;li&gt;⚡ NanoID shorter but slower at massive scale&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  b) &lt;strong&gt;Snowflake Algorithm (used by Twitter, TikTok)&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Snowflake&lt;/strong&gt; generates a 64-bit integer using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Timestamp&lt;/li&gt;
&lt;li&gt;Machine ID&lt;/li&gt;
&lt;li&gt;Process ID&lt;/li&gt;
&lt;li&gt;Sequence Counter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s &lt;strong&gt;ultra-fast&lt;/strong&gt;, distributed-safe, and scales horizontally across servers.&lt;/p&gt;
&lt;h4&gt;
  
  
  Example in TypeScript:
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Snowflake&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;lastTimestamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;sequence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;machineId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;bigint&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;machineId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;machineId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;machineId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mb"&gt;0b11111&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 5 bits&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;nextId&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lastTimestamp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sequence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sequence&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mb"&gt;0b111111111111&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 12 bits&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sequence&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sequence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lastTimestamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
      &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1700000000000&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;machineId&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sequence&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&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;h3&gt;
  
  
  🔢 4. Enhancing Snowflake with Base36/Base62 Encoding
&lt;/h3&gt;

&lt;p&gt;To make IDs &lt;strong&gt;shorter, URL-safe, and more random-looking&lt;/strong&gt;, encode them in Base62.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;toBase62&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;bigint&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chars&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;62&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;chars&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rem&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;num&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;62&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;padStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// fixed length 13&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now combine both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;snow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Snowflake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;toBase62&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;snow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nextId&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// e.g. "00bX5ztuG8p3L"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✨ Result:&lt;br&gt;
Short, unique, URL-safe, and &lt;strong&gt;crazy fast&lt;/strong&gt; 🔥&lt;/p&gt;


&lt;h3&gt;
  
  
  ⚡ 5. Performance Comparison
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Length&lt;/th&gt;
&lt;th&gt;Sortable&lt;/th&gt;
&lt;th&gt;Collision Risk&lt;/th&gt;
&lt;th&gt;Speed&lt;/th&gt;
&lt;th&gt;Memory Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;UUIDv4&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NanoID&lt;/td&gt;
&lt;td&gt;~21&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Snowflake&lt;/td&gt;
&lt;td&gt;19 digits&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Very Low&lt;/td&gt;
&lt;td&gt;⚡ Very Fast&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Snowflake + Base62&lt;/td&gt;
&lt;td&gt;11–13 chars&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Very Low&lt;/td&gt;
&lt;td&gt;⚡⚡ Blazing&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h3&gt;
  
  
  🔒 6. Predictability vs Randomness
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Snowflake IDs&lt;/strong&gt; are time-sequential → predictable but easy to sort.&lt;/li&gt;
&lt;li&gt;Adding &lt;strong&gt;Base62 encoding&lt;/strong&gt; makes them opaque.&lt;/li&gt;
&lt;li&gt;For extra randomness, add a &lt;strong&gt;salt or hash layer&lt;/strong&gt; (SHA1 / MD5 hash slice).&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  🌍 7. Real-world Usage
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🐦 &lt;strong&gt;Twitter&lt;/strong&gt;, 💬 &lt;strong&gt;Discord&lt;/strong&gt;, 📸 &lt;strong&gt;Instagram&lt;/strong&gt; → use Snowflake-like systems&lt;/li&gt;
&lt;li&gt;🔗 &lt;strong&gt;TinyURL&lt;/strong&gt;, &lt;strong&gt;Bitly&lt;/strong&gt; → use Base62 for compact links&lt;/li&gt;
&lt;li&gt;☁️ &lt;strong&gt;Firebase / Firestore&lt;/strong&gt; → time-based + random push IDs&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  🧮 8. Generating in Chunks (for Crores of IDs)
&lt;/h3&gt;

&lt;p&gt;You can generate &lt;strong&gt;crores of IDs&lt;/strong&gt; efficiently by batching them into chunks.&lt;br&gt;
This avoids memory overload and stays lightning fast ⚙️&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;snow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Snowflake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CHUNK_SIZE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 1 lakh IDs&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TOTAL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="nx"&gt;_000_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// 1 crore IDs&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createWriteStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ids.txt&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="na"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateIDs&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Generation&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;TOTAL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;CHUNK_SIZE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;chunk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;CHUNK_SIZE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;toBase62&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;snow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nextId&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;
      &lt;span class="nx"&gt;chunk&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&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="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`✅ Generated &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;CHUNK_SIZE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; IDs`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timeEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Generation&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="nf"&gt;generateIDs&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;💡 This can easily scale to &lt;em&gt;tens of crores&lt;/em&gt; of unique IDs with &lt;strong&gt;constant memory usage&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧭 9. Best Choice
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Recommended Method&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Distributed systems (Twitter, Discord)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Snowflake + Base62&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Small apps / prototypes&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;NanoID&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Human-readable short links&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Random Base62 + Collision Check&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  🏁 10. Conclusion
&lt;/h3&gt;

&lt;p&gt;A strong ID generation system is the &lt;strong&gt;backbone of scalability&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;By combining &lt;strong&gt;Snowflake&lt;/strong&gt; with &lt;strong&gt;Base62 encoding&lt;/strong&gt;, we get IDs that are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡ Fast&lt;/li&gt;
&lt;li&gt;🧩 Compact&lt;/li&gt;
&lt;li&gt;🌍 Globally unique&lt;/li&gt;
&lt;li&gt;⏱️ Time-sortable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perfect for &lt;strong&gt;e-commerce&lt;/strong&gt;, &lt;strong&gt;URL shorteners&lt;/strong&gt;, and &lt;strong&gt;microservice architectures&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💬 &lt;em&gt;Would you like me to write a follow-up on multi-threaded ID generation (using Node.js Workers) to scale to 100+ crore IDs? Comment below!&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;💡 &lt;em&gt;If you found this helpful, follow me for more backend &amp;amp; TypeScript scalability insights!&lt;/em&gt;&lt;/p&gt;




</description>
      <category>typescript</category>
      <category>webdev</category>
      <category>backend</category>
      <category>programming</category>
    </item>
    <item>
      <title>Mastering Type Annotations in TypeScript: A Beginner’s Guide</title>
      <dc:creator>Srashti Gupta</dc:creator>
      <pubDate>Tue, 28 Oct 2025 13:25:17 +0000</pubDate>
      <link>https://dev.to/srashtigupta/mastering-type-annotations-in-typescript-a-beginners-guide-4c3e</link>
      <guid>https://dev.to/srashtigupta/mastering-type-annotations-in-typescript-a-beginners-guide-4c3e</guid>
      <description>&lt;p&gt;&lt;em&gt;TypeScript makes JavaScript smarter — and Type Annotations are the brain behind it.&lt;/em&gt; 🧩&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 What Are Type Annotations?
&lt;/h2&gt;

&lt;p&gt;Type annotations let you &lt;strong&gt;explicitly define the type&lt;/strong&gt; of a variable, function parameter, or return value in TypeScript.&lt;br&gt;
They’re written using a colon (&lt;code&gt;:&lt;/code&gt;) followed by the type.&lt;/p&gt;

&lt;p&gt;let message: string = "Hello, TypeScript!";&lt;/p&gt;

&lt;p&gt;function add(a: number, b: number): number {&lt;br&gt;
  return a + b;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;message&lt;/code&gt; is a &lt;code&gt;string&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;a&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt; are &lt;code&gt;number&lt;/code&gt;s&lt;/li&gt;
&lt;li&gt;The function &lt;code&gt;add&lt;/code&gt; returns a &lt;code&gt;number&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎯 Why Use Type Annotations?
&lt;/h2&gt;

&lt;p&gt;Even though TypeScript can infer types, using explicit annotations gives you more control and clarity.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Clarity &amp;amp; Readability&lt;/strong&gt; – self-documenting code&lt;br&gt;
✅ &lt;strong&gt;Error Detection&lt;/strong&gt; – catch mistakes before runtime&lt;br&gt;
✅ &lt;strong&gt;IDE Support&lt;/strong&gt; – better autocompletion and refactoring&lt;/p&gt;

&lt;h2&gt;
  
  
  🔧 Where Type Annotations Are Used
&lt;/h2&gt;

&lt;p&gt;Let’s explore the most common use cases 👇&lt;/p&gt;

&lt;h3&gt;
  
  
  1. 🧮 Variables &amp;amp; Constants
&lt;/h3&gt;

&lt;p&gt;let name: string = "Alice";&lt;br&gt;
const age: number = 30;&lt;br&gt;
let isActive: boolean = true;&lt;/p&gt;

&lt;p&gt;These ensure that each variable holds only the correct type of data.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. 📦 Arrays
&lt;/h3&gt;

&lt;p&gt;You can annotate arrays in two ways:&lt;/p&gt;

&lt;p&gt;let numbers: number[] = [1, 2, 3];&lt;br&gt;
let names: Array = ["Bob", "Charlie"];&lt;/p&gt;

&lt;p&gt;Both are valid; pick your preferred style.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. 👥 Object Types
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Anonymous Object Type
&lt;/h4&gt;

&lt;p&gt;function printPerson(person: { name: string; age: number }) {&lt;br&gt;
  console.log(&lt;code&gt;Name: ${person.name}, Age: ${person.age}&lt;/code&gt;);&lt;br&gt;
}&lt;/p&gt;

&lt;h4&gt;
  
  
  Named Object Type (Using Interface)
&lt;/h4&gt;

&lt;p&gt;interface User {&lt;br&gt;
  id: number;&lt;br&gt;
  username: string;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;let user: User = { id: 1, username: "John Doe" };&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Tip:&lt;/strong&gt; Use interfaces when multiple objects share the same structure.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. 🔢 Function Return Types
&lt;/h3&gt;

&lt;p&gt;Specify what a function should return for safety and clarity.&lt;/p&gt;

&lt;p&gt;function multiply(a: number, b: number): number {&lt;br&gt;
  return a * b;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;function logMessage(message: string): void {&lt;br&gt;
  console.log(message);&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;void&lt;/code&gt; for functions that don’t return anything.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. 🔁 Type Aliases for Functions
&lt;/h3&gt;

&lt;p&gt;A type alias defines a reusable function pattern.&lt;/p&gt;

&lt;p&gt;type MathOperation = (x: number, y: number) =&amp;gt; number;&lt;/p&gt;

&lt;p&gt;let subtract: MathOperation = (a, b) =&amp;gt; a - b;&lt;/p&gt;

&lt;p&gt;This is perfect for maintaining consistency across multiple operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧩 Summary Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Variable Type&lt;/td&gt;
&lt;td&gt;&lt;code&gt;let name: string = "Alice"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Defines type of variable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Function Params&lt;/td&gt;
&lt;td&gt;&lt;code&gt;function add(a: number, b: number)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ensures input types&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Return Type&lt;/td&gt;
&lt;td&gt;&lt;code&gt;: number&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Specifies return value type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Array&lt;/td&gt;
&lt;td&gt;&lt;code&gt;let arr: number[] = [1,2,3]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Defines element type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interface&lt;/td&gt;
&lt;td&gt;&lt;code&gt;interface User { id: number; name: string }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Defines object structure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type Alias&lt;/td&gt;
&lt;td&gt;&lt;code&gt;type Operation = (x: number, y: number) =&amp;gt; number&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Function type pattern&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  🚀 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Type annotations are the backbone of TypeScript’s type safety.&lt;br&gt;
They turn your JavaScript into a &lt;strong&gt;predictable, readable, and maintainable&lt;/strong&gt; codebase.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💬 As your project grows, explicit type annotations save hours of debugging and make your app scalable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;🧑‍💻 &lt;strong&gt;Written by:&lt;/strong&gt; &lt;a href="https://dev.to/"&gt;Srashti Gupta&lt;/a&gt;&lt;br&gt;
📅 &lt;strong&gt;Published on:&lt;/strong&gt; October 2025&lt;br&gt;
🏷️ &lt;em&gt;#typescript #javascript #webdev #programming #beginners&lt;/em&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>TypeScript Important Concepts Every Developer Should Know</title>
      <dc:creator>Srashti Gupta</dc:creator>
      <pubDate>Thu, 09 Oct 2025 17:17:37 +0000</pubDate>
      <link>https://dev.to/srashtigupta/typescript-important-concepts-every-developer-should-know-4jma</link>
      <guid>https://dev.to/srashtigupta/typescript-important-concepts-every-developer-should-know-4jma</guid>
      <description>&lt;p&gt;TypeScript is an &lt;strong&gt;open-source programming language&lt;/strong&gt; that builds on JavaScript by adding &lt;strong&gt;optional static typing&lt;/strong&gt; and &lt;strong&gt;class-based object-oriented programming&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It helps developers write &lt;strong&gt;more reliable&lt;/strong&gt;, &lt;strong&gt;scalable&lt;/strong&gt;, and &lt;strong&gt;maintainable&lt;/strong&gt; code — especially in &lt;strong&gt;large-scale projects&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this article, we’ll explore &lt;strong&gt;10 key TypeScript concepts&lt;/strong&gt; that every developer should understand.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;1. Type Annotations&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Type annotations let you specify the data type of variables, function parameters, and return values.&lt;br&gt;
This helps &lt;strong&gt;catch errors early&lt;/strong&gt; and improves &lt;strong&gt;code readability&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, &lt;code&gt;age&lt;/code&gt; must always be a &lt;strong&gt;number&lt;/strong&gt;.&lt;br&gt;
If you try assigning a string to it, TypeScript will throw a compile-time error.&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;2. Interfaces&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;interface&lt;/strong&gt; defines the &lt;strong&gt;shape of an object&lt;/strong&gt; — its structure and property types.&lt;br&gt;
It ensures consistency across multiple objects.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Person&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Srashti&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;💡 &lt;strong&gt;Tip:&lt;/strong&gt; Interfaces help enforce structure, making code predictable and self-documenting.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;3. Classes&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;TypeScript supports full &lt;strong&gt;object-oriented programming (OOP)&lt;/strong&gt; through classes.&lt;br&gt;
They serve as blueprints for objects, supporting &lt;strong&gt;inheritance&lt;/strong&gt;, &lt;strong&gt;constructors&lt;/strong&gt;, and &lt;strong&gt;access modifiers&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Animal&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;name&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;Here, &lt;code&gt;Animal&lt;/code&gt; is a class with a property &lt;code&gt;name&lt;/code&gt; and a constructor that initializes it.&lt;/p&gt;

&lt;p&gt;TypeScript extends JavaScript classes with features like &lt;strong&gt;access modifiers (public, private, protected)&lt;/strong&gt; and &lt;strong&gt;readonly properties&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;4. Generics&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Generics let you write &lt;strong&gt;reusable and type-safe&lt;/strong&gt; functions, interfaces, and classes.&lt;br&gt;
They help avoid code duplication while maintaining flexibility.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;output1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Srashti&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;output2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;strong&gt;Why use Generics?&lt;/strong&gt;&lt;br&gt;
They allow your functions to work with &lt;strong&gt;any data type&lt;/strong&gt;, ensuring &lt;strong&gt;type safety&lt;/strong&gt; without losing flexibility.&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;5. Enums&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Enums define a set of &lt;strong&gt;named constant values&lt;/strong&gt; — useful when dealing with a predefined list of options.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;Color&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Green&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Blue&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also assign specific numeric values:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;enum&lt;/span&gt; &lt;span class="nx"&gt;Color&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Red&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Green&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Blue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes your code more readable and prevents invalid values.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;6. Type Inference&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;TypeScript can &lt;strong&gt;infer types automatically&lt;/strong&gt; based on assigned values.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// inferred as 'number'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even without explicit type annotations, TypeScript understands that &lt;code&gt;age&lt;/code&gt; is a number.&lt;/p&gt;

&lt;p&gt;It also infers function return types:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// inferred as number&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;7. Union and Intersection Types&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Union types allow variables to hold &lt;strong&gt;multiple possible types&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;twenty-seven&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Intersection types, on the other hand, &lt;strong&gt;combine multiple types&lt;/strong&gt; into one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Dog&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;bark&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Cat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;meow&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Animal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Dog&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;Cat&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, &lt;code&gt;Animal&lt;/code&gt; includes both &lt;code&gt;bark()&lt;/code&gt; and &lt;code&gt;meow()&lt;/code&gt; methods.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;8. Type Guards&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Type guards allow you to &lt;strong&gt;check variable types at runtime&lt;/strong&gt;, especially when using unions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;printValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;number&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&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;Type guards help you safely handle multiple types in a single function.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;9. Decorators&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Decorators are &lt;strong&gt;metadata annotations&lt;/strong&gt; for classes, methods, or properties.&lt;br&gt;
They are often used in frameworks like &lt;strong&gt;Angular&lt;/strong&gt; and &lt;strong&gt;NestJS&lt;/strong&gt; for dependency injection and configuration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;deprecated&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyClass&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example marks the class as deprecated.&lt;br&gt;
Decorators are still an &lt;strong&gt;experimental feature&lt;/strong&gt;, so you need to enable them in your &lt;code&gt;tsconfig.json&lt;/code&gt; file (&lt;code&gt;"experimentalDecorators": true&lt;/code&gt;).&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;10. Modules&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Modules help &lt;strong&gt;organize code&lt;/strong&gt; into smaller, reusable pieces.&lt;br&gt;
They allow you to export and import variables, classes, or functions between files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// mathUtils.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// main.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="p"&gt;}&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;./mathUtils&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// 15&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modules make code &lt;strong&gt;modular&lt;/strong&gt;, &lt;strong&gt;maintainable&lt;/strong&gt;, and &lt;strong&gt;easy to scale&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 &lt;strong&gt;Final Thoughts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;TypeScript adds a &lt;strong&gt;powerful type system&lt;/strong&gt; and &lt;strong&gt;OOP features&lt;/strong&gt; to JavaScript, helping developers build large, error-free applications.&lt;/p&gt;

&lt;p&gt;Mastering these 10 concepts — &lt;strong&gt;from type annotations to generics and modules&lt;/strong&gt; — will greatly improve your ability to write &lt;strong&gt;clean, robust, and professional TypeScript code&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>typescript</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>🌟 Understanding Generics in TypeScript: The Key to Reusable, Type-Safe Code</title>
      <dc:creator>Srashti Gupta</dc:creator>
      <pubDate>Thu, 09 Oct 2025 16:50:55 +0000</pubDate>
      <link>https://dev.to/srashtigupta/understanding-generics-in-typescript-the-key-to-reusable-type-safe-code-2963</link>
      <guid>https://dev.to/srashtigupta/understanding-generics-in-typescript-the-key-to-reusable-type-safe-code-2963</guid>
      <description>&lt;p&gt;Generics are a &lt;strong&gt;fundamental feature in TypeScript&lt;/strong&gt; that allow developers to create &lt;strong&gt;reusable&lt;/strong&gt;, &lt;strong&gt;flexible&lt;/strong&gt;, and &lt;strong&gt;type-safe&lt;/strong&gt; components.&lt;br&gt;
They enable functions, classes, and interfaces to work with &lt;strong&gt;different data types&lt;/strong&gt; without losing type information — ensuring both &lt;strong&gt;code reusability&lt;/strong&gt; and &lt;strong&gt;type safety&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧩 Why Do We Need Generics?
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. &lt;strong&gt;Code Reusability&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Generics allow you to write a single function, class, or interface that can operate on different data types.&lt;/p&gt;

&lt;p&gt;Without generics, you might end up writing multiple versions of the same function for each data type.&lt;br&gt;
Generics solve that problem by using &lt;strong&gt;type parameters&lt;/strong&gt; — placeholders for any type.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;output1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;myString&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;output2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, &lt;code&gt;&amp;lt;T&amp;gt;&lt;/code&gt; acts as a &lt;strong&gt;type variable&lt;/strong&gt;, allowing the same function to handle both &lt;code&gt;string&lt;/code&gt; and &lt;code&gt;number&lt;/code&gt; without duplicating logic.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. &lt;strong&gt;Type Safety&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Generics enable &lt;strong&gt;compile-time type checking&lt;/strong&gt;, catching errors early in the development process — long before they cause runtime issues.&lt;/p&gt;

&lt;p&gt;TypeScript knows exactly what type you’re working with, which improves both reliability and maintainability.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. &lt;strong&gt;Improved Code Readability&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;By explicitly defining generic types, you make your code’s intent clearer.&lt;br&gt;
Readers and collaborators can easily understand the expected data types and structure.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧠 Generic Building Blocks
&lt;/h2&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Type Parameters&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Generic types use &lt;strong&gt;type parameters&lt;/strong&gt;, usually represented by &lt;strong&gt;uppercase letters&lt;/strong&gt; inside &lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symbol&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;T&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;K&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;V&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Value&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  ⚙️ Generic Functions
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;generic function&lt;/strong&gt; allows you to handle multiple data types with one implementation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;output1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Srashti&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;output2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧾 Generic Interfaces
&lt;/h2&gt;

&lt;p&gt;Generic interfaces define &lt;strong&gt;contracts&lt;/strong&gt; for objects that can work with multiple data types.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;GenericIdentityFn&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;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;arg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;myIdentity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;GenericIdentityFn&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;identity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures that the &lt;code&gt;identity&lt;/code&gt; function only works with the data type defined (&lt;code&gt;number&lt;/code&gt; in this case).&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ Generic Classes
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;generic class&lt;/strong&gt; can handle data of different types dynamically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GenericNumber&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;zeroValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;add&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;myGenericNumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;GenericNumber&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;myGenericNumber&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;zeroValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;myGenericNumber&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes it easy to create flexible classes that adapt to multiple data types.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔒 Generic Constraints
&lt;/h2&gt;

&lt;p&gt;Sometimes, you want to restrict what kinds of types can be passed to a generic.&lt;br&gt;
You can use &lt;strong&gt;constraints&lt;/strong&gt; with the &lt;code&gt;extends&lt;/code&gt; keyword.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Lengthwise&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;loggingIdentity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Lengthwise&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Safe access to 'length'&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;arg&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;Now, only types that have a &lt;code&gt;length&lt;/code&gt; property (like strings or arrays) can be used with this function.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌐 Generics in TypeScript APIs
&lt;/h2&gt;

&lt;p&gt;When building APIs, generics make your functions and interfaces reusable and type-safe — especially for &lt;strong&gt;API responses&lt;/strong&gt; that share the same structure but contain different data types.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. &lt;strong&gt;Generic Interface for API Response&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;message&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&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;Here, &lt;code&gt;T&lt;/code&gt; represents the type of data returned by the API — it can be &lt;code&gt;User[]&lt;/code&gt;, &lt;code&gt;Product[]&lt;/code&gt;, or anything else.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. &lt;strong&gt;Generic Function for Fetching Data&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`HTTP error! status: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="na"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ApiResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;result&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;This function adapts to any API endpoint while maintaining strict type safety.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. &lt;strong&gt;Using Generic Types with Different Data&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Product&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Fetch Users&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getUsers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fetchData&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Type: User[]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&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="c1"&gt;// Fetch Products&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getProducts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;productResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fetchData&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;productResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Type: Product[]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&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;h2&gt;
  
  
  💡 Benefits of Using Generics in APIs
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Type Safety:&lt;/strong&gt; Prevents type mismatches and runtime errors.&lt;br&gt;
✅ &lt;strong&gt;Reusability:&lt;/strong&gt; Use the same logic for different endpoints.&lt;br&gt;
✅ &lt;strong&gt;Reduced Code Duplication:&lt;/strong&gt; Write once, use everywhere.&lt;br&gt;
✅ &lt;strong&gt;Improved Readability:&lt;/strong&gt; Clearly define the shape and type of expected data.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Conclusion
&lt;/h2&gt;

&lt;p&gt;Generics are one of the most powerful features in TypeScript.&lt;br&gt;
They make your code &lt;strong&gt;cleaner, safer, and more scalable&lt;/strong&gt; — perfect for building robust applications or APIs.&lt;/p&gt;

&lt;p&gt;Whether you’re creating utility functions, classes, or API handlers, mastering generics will &lt;strong&gt;level up your TypeScript skills&lt;/strong&gt; and help you write professional, production-ready code.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>softwareengineering</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🛠 Common CI/CD Errors in Docker + AWS ECS Deployment (and How to Fix Them)</title>
      <dc:creator>Srashti Gupta</dc:creator>
      <pubDate>Tue, 15 Jul 2025 13:31:27 +0000</pubDate>
      <link>https://dev.to/srashtigupta/common-cicd-errors-in-docker-aws-ecs-deployment-and-how-to-fix-them-cin</link>
      <guid>https://dev.to/srashtigupta/common-cicd-errors-in-docker-aws-ecs-deployment-and-how-to-fix-them-cin</guid>
      <description>&lt;p&gt;Facing issues while deploying your Node.js app to AWS ECS with Docker and GitHub Actions? Here’s a complete list of &lt;strong&gt;common CI/CD errors&lt;/strong&gt; and easy, step-by-step solutions with clear explanations. ✅&lt;/p&gt;

&lt;h2&gt;
  
  
  🔍 Issue &amp;amp; 🛠 Fix Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;🔍 Issue&lt;/th&gt;
&lt;th&gt;🛠 Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;❌ Docker build fails&lt;/td&gt;
&lt;td&gt;✅ Check Dockerfile syntax and &lt;code&gt;.dockerignore&lt;/code&gt; context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;❌ Missing secrets&lt;/td&gt;
&lt;td&gt;✅ Add all secrets in GitHub → Settings → Actions → Secrets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;❌ ECS service fails to deploy&lt;/td&gt;
&lt;td&gt;✅ Double-check ECS cluster, task def, and service names&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;❌ App crashes in ECS&lt;/td&gt;
&lt;td&gt;✅ View logs under ECS → Tasks → Logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;❌ Latest image not deployed&lt;/td&gt;
&lt;td&gt;✅ Use &lt;code&gt;--force-new-deployment&lt;/code&gt; in ECS or update image tag&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  🔍 Error: Docker Build Fails
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Message:&lt;/strong&gt;&lt;br&gt;
Docker build command fails, often with missing file or bad instruction errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
You likely forgot to copy &lt;code&gt;package.json&lt;/code&gt; correctly in your Dockerfile (or misplaced the order).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .  # copy source only after dependencies&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔍 Error: Missing Secrets or Environment Variables
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Message:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MONGO_URI is undefined
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Your code references secrets/env-vars not passed along in the ECS definition.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Fix:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;ECS → Task Definitions&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Add required environment variables: e.g., &lt;code&gt;MONGO_URI&lt;/code&gt;, &lt;code&gt;JWT_SECRET&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;(Alternatively) Use &lt;strong&gt;AWS Secrets Manager&lt;/strong&gt; and reference them in the task.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  🔍 Error: ECS Fails to Deploy New Task
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Messages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm ERR! enoent ENOENT: no such file or directory, open 'package.json'&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ServiceNotFoundException&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CannotPullContainerError&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Incorrect ECS cluster/service/task name in your GitHub Actions workflow, or the image/tag does not exist in ECR.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Fix:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Double-check the names in your:

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ECS cluster&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ECS service&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Task definition&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ensure the correct image tag exists in the ECR repository.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  🔍 Error: App Crashes After Deployment
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
ECS service stops immediately. No public access or &lt;code&gt;502 Bad Gateway&lt;/code&gt; from load balancer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Fix:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;ECS → Tasks → Logs&lt;/strong&gt; and view the error output.&lt;/li&gt;
&lt;li&gt;Make sure your app is listening globally, not just on &lt;code&gt;localhost&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0.0.0.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  🔍 Error: Docker Image Doesn’t Update
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
You’re using a static &lt;code&gt;latest&lt;/code&gt; tag and ECS believes it already deployed it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Fix:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use &lt;code&gt;--force-new-deployment&lt;/code&gt; to trigger ECS to re-pull the image, or update to a different tag.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;🚀 Deploy to Amazon ECS&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;aws ecs update-service \&lt;/span&gt;
      &lt;span class="s"&gt;--cluster $ECS_CLUSTER \&lt;/span&gt;
      &lt;span class="s"&gt;--service $ECS_SERVICE \&lt;/span&gt;
      &lt;span class="s"&gt;--force-new-deployment&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ✅ Bonus: Use a &lt;code&gt;.dockerignore&lt;/code&gt; File
&lt;/h2&gt;

&lt;p&gt;Speed up builds and prevent accidental context issues:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node_modules
.env
.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧠 Conclusion
&lt;/h2&gt;

&lt;p&gt;CI/CD is powerful, but small misconfigurations can halt deployments. Be sure to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Carefully review build logs&lt;/li&gt;
&lt;li&gt;Monitor ECS logs&lt;/li&gt;
&lt;li&gt;Always verify secrets and naming&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once setup is smooth, your Dockerized Node.js app will deploy automatically to AWS ECS with every push! 🔁&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Let me know in the comments if you’d like a template for:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Actions workflow
&lt;/li&gt;
&lt;li&gt;Dockerfile
&lt;/li&gt;
&lt;li&gt;AWS ECS task definition (in JSON)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy Deploying! 🚀&lt;/p&gt;

</description>
      <category>docker</category>
      <category>aws</category>
      <category>devops</category>
      <category>node</category>
    </item>
    <item>
      <title>React Performance Optimization Techniques</title>
      <dc:creator>Srashti Gupta</dc:creator>
      <pubDate>Tue, 08 Jul 2025 15:35:10 +0000</pubDate>
      <link>https://dev.to/srashtigupta/react-performance-optimization-techniques-3nba</link>
      <guid>https://dev.to/srashtigupta/react-performance-optimization-techniques-3nba</guid>
      <description>&lt;p&gt;Optimizing React applications is essential for delivering fast, responsive user experiences. Below is an in-depth exploration of the most effective strategies for improving React performance, including practical implementation advice and key considerations.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Lazy Loading
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Concept:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Load components, modules, or assets only when they are needed, rather than during the initial page load.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;React.lazy()&lt;/code&gt; and `` to load components dynamically.&lt;/li&gt;
&lt;li&gt;For images and assets, use the &lt;code&gt;loading="lazy"&lt;/code&gt; attribute or libraries like &lt;code&gt;react-lazy-load-image-component&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduces initial bundle size.&lt;/li&gt;
&lt;li&gt;Improves first paint and time-to-interactive, especially in large apps.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. React.memo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Concept:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A higher-order component that memoizes functional components, preventing unnecessary re-renders when props have not changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wrap function components with &lt;code&gt;React.memo(Component)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Only re-renders if props change via shallow comparison.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Useful for components that render frequently with the same props.&lt;/li&gt;
&lt;li&gt;Particularly effective for list items, buttons, or visual elements that rarely change.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Code Splitting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Concept:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Splitting the application code into smaller chunks that are loaded on demand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use dynamic &lt;code&gt;import()&lt;/code&gt; statements.&lt;/li&gt;
&lt;li&gt;Leverage tools like Webpack, Rollup, or route-based splitting with React Router.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduces initial load time.&lt;/li&gt;
&lt;li&gt;Allows users to download only what they need, when they need it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Inline Functions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Issue:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Defining functions inside render methods or JSX creates new function instances on every render, which can trigger unnecessary re-renders in child components.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Optimization:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;useCallback&lt;/code&gt; to memoize functions.&lt;/li&gt;
&lt;li&gt;Define functions outside the render scope when possible.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Lazy Loading Images
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Concept:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Defer loading of images until they enter the viewport.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the &lt;code&gt;loading="lazy"&lt;/code&gt; attribute on `` tags.&lt;/li&gt;
&lt;li&gt;For more control, use Intersection Observer API or libraries like &lt;code&gt;react-lazy-load-image-component&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduces bandwidth usage.&lt;/li&gt;
&lt;li&gt;Speeds up initial render, especially in image-heavy applications.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Memoization
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Concept:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Cache the results of expensive computations or component renders to avoid redundant work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;useMemo()&lt;/code&gt; for memoizing values.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;useCallback()&lt;/code&gt; for memoizing functions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prevents unnecessary recalculations.&lt;/li&gt;
&lt;li&gt;Reduces CPU usage and improves responsiveness.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. React Fragments
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Concept:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Group multiple elements without adding extra nodes to the DOM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt; or ``.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduces DOM size and memory usage.&lt;/li&gt;
&lt;li&gt;Useful for rendering lists or complex layouts efficiently.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  8. Throttling and Debouncing Events
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Concept:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Limit how often event handlers (like scroll, resize, or input) are triggered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use utility libraries such as Lodash (&lt;code&gt;_.throttle&lt;/code&gt;, &lt;code&gt;_.debounce&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Custom hooks can be created for reusable throttling/debouncing logic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prevents performance bottlenecks from rapid event firing.&lt;/li&gt;
&lt;li&gt;Improves perceived and actual responsiveness.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  9. Key Coordination for List Rendering
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best Practice:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Assign unique and stable keys to list items.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Important:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Helps React efficiently update and reconcile lists.&lt;/li&gt;
&lt;li&gt;Avoids unnecessary re-renders and DOM manipulations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  10. Measuring React Performance
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Tools:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React DevTools Profiler: Analyze component render times and re-renders.&lt;/li&gt;
&lt;li&gt;Browser Performance APIs: Use &lt;code&gt;window.performance&lt;/code&gt; for custom metrics.&lt;/li&gt;
&lt;li&gt;Custom logging: Track specific performance bottlenecks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  11. Memoize React Components
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;React.memo&lt;/code&gt; for functional components.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;PureComponent&lt;/code&gt; for class components.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Effect:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Prevents unnecessary re-renders by performing shallow prop and state comparisons.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Dependency Optimization
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Concept:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Carefully manage dependencies in hooks (&lt;code&gt;useEffect&lt;/code&gt;, &lt;code&gt;useMemo&lt;/code&gt;, &lt;code&gt;useCallback&lt;/code&gt;) to avoid redundant executions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best Practices:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only include necessary dependencies.&lt;/li&gt;
&lt;li&gt;Avoid creating new objects or functions inside dependencies unless required.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  13. Implement PureComponent
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Concept:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A class component that implements a shallow comparison of props and state in &lt;code&gt;shouldComponentUpdate&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prevents unnecessary re-renders for class components.&lt;/li&gt;
&lt;li&gt;Useful for optimizing performance in large, complex UIs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  14. List Virtualization
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Concept:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Render only the visible portion of long lists, rather than the entire list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use libraries like &lt;code&gt;react-window&lt;/code&gt; or &lt;code&gt;react-virtualized&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Greatly reduces DOM node count and memory usage.&lt;/li&gt;
&lt;li&gt;Improves scroll performance in large lists.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  15. useCallback
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Concept:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Memoize callback functions so they are not recreated on every render.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wrap functions passed as props to child components.&lt;/li&gt;
&lt;li&gt;Reduces unnecessary re-renders in children relying on function identity.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  16. Web Workers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Concept:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Offload heavy computations to background threads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the Web Workers API for tasks like data processing, image manipulation, or parsing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keeps the UI thread responsive.&lt;/li&gt;
&lt;li&gt;Prevents blocking user interactions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  17. Keeping Component State Local
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Concept:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Store state as locally as possible, rather than lifting it unnecessarily.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduces the number of components that re-render when state changes.&lt;/li&gt;
&lt;li&gt;Simplifies component logic and improves maintainability.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  18. Use Production Build
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Production builds of React are optimized for performance, with extra checks and warnings removed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;npm run build&lt;/code&gt; to create an optimized bundle for deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  19. React Redux Optimization
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Strategies:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;connect&lt;/code&gt;'s &lt;code&gt;mapStateToProps&lt;/code&gt; efficiently to avoid unnecessary re-renders.&lt;/li&gt;
&lt;li&gt;Use selectors (e.g., Reselect) for memoizing derived data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  20. Immutable Data Structures
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Concept:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Use immutable objects and arrays for state management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Makes change detection faster and more predictable.&lt;/li&gt;
&lt;li&gt;Helps React efficiently determine when to update components.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By combining these techniques, you can significantly enhance the speed, responsiveness, and scalability of your React applications. Each optimization should be applied judiciously, based on profiling and actual app needs, to achieve the best results.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>USE EFFECT HOOK</title>
      <dc:creator>Srashti Gupta</dc:creator>
      <pubDate>Wed, 04 Jun 2025 11:10:12 +0000</pubDate>
      <link>https://dev.to/srashtigupta/use-effect-hook-g35</link>
      <guid>https://dev.to/srashtigupta/use-effect-hook-g35</guid>
      <description>&lt;p&gt;Here’s a clean, well-structured, and engaging blog post draft about the React useEffect hook, including best practices, examples, and common pitfalls, all based on the latest guidance and real-world scenarios:&lt;/p&gt;




&lt;h2&gt;
  
  
  Demystifying the useEffect Hook in React
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why I Wrote This Post
&lt;/h3&gt;

&lt;p&gt;When I first started building React apps, I found myself confused about when and how to use the useEffect hook. It’s a powerful tool for handling side effects, but it can also introduce subtle bugs if not used carefully. In this post, I’ll share what I’ve learned about useEffect, show you practical examples, and help you avoid common mistakes—so you can write more predictable and efficient React code.&lt;/p&gt;







&lt;h2&gt;
  
  
  What Is useEffect?
&lt;/h2&gt;

&lt;p&gt;The useEffect hook lets you perform side effects in your React functional components. Side effects include tasks like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fetching data from an API&lt;/li&gt;
&lt;li&gt;Setting up event listeners&lt;/li&gt;
&lt;li&gt;Updating the DOM directly&lt;/li&gt;
&lt;li&gt;Managing timers or subscriptions[1][3][4][17]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before hooks, these tasks were handled in class components using lifecycle methods like &lt;code&gt;componentDidMount&lt;/code&gt;, &lt;code&gt;componentDidUpdate&lt;/code&gt;, and &lt;code&gt;componentWillUnmount&lt;/code&gt;. With useEffect, you can do all of this in functional components—making your code more concise and easier to manage[1][3][17].&lt;/p&gt;




&lt;h2&gt;
  
  
  Basic Syntax
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Side effect logic here&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Optional cleanup logic 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;span class="nx"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Effect function:&lt;/strong&gt; Runs after every render by default.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleanup function (optional):&lt;/strong&gt; Runs before the effect is re-executed or when the component unmounts—useful for cleaning up subscriptions, timers, or event listeners.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependencies array:&lt;/strong&gt; Controls when the effect runs. If empty (&lt;code&gt;[]&lt;/code&gt;), the effect runs only once after the initial render; if omitted, it runs after every render; if you list variables, it runs when any of those variables change[3][4][8][13][15].&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Practical Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Run Once on Mount
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Component mounted!&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="c1"&gt;// Only runs once after the first render&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Run When a Value Changes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`Count: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// Runs every time count changes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Fetch Data on Mount
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;setData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nf"&gt;fetchData&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="c1"&gt;// Runs only once after the first render&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Cleanup Example (Event Listener)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handleResize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Window resized!&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="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;resize&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleResize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;removeEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;resize&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleResize&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="c1"&gt;// Adds and cleans up the event listener&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Always specify the dependencies array:&lt;/strong&gt; This prevents unnecessary or missed effect executions and avoids performance issues[8][16].&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Include all dependencies:&lt;/strong&gt; List every variable from the component scope that your effect uses. Missing dependencies can cause bugs or stale data[8][16].&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use multiple useEffect hooks for separate concerns:&lt;/strong&gt; This keeps your code organized and easier to debug[2][8].&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Always clean up side effects:&lt;/strong&gt; Return a cleanup function to remove event listeners, timers, or subscriptions to prevent memory leaks[8][15].&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid overusing useEffect:&lt;/strong&gt; Not all logic needs to be inside useEffect. For derived state or simple computations, use regular variables or memoization[2][6][8].&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Pitfalls and How to Avoid Them
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pitfall&lt;/th&gt;
&lt;th&gt;How to Avoid It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Forgetting dependencies&lt;/td&gt;
&lt;td&gt;Always include all variables your effect uses in the dependency array[8][16].&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infinite loops from state updates&lt;/td&gt;
&lt;td&gt;Don’t update state unconditionally inside useEffect; use guards or conditions if needed[8][16].&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory leaks from uncleaned side effects&lt;/td&gt;
&lt;td&gt;Always return a cleanup function to remove listeners, timers, or subscriptions[8][15].&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overcomplicating effects&lt;/td&gt;
&lt;td&gt;Only use useEffect for true side effects, not for simple value calculations or rendering logic[8][2].&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Using useEffect for data transformation&lt;/td&gt;
&lt;td&gt;Compute derived data directly in render, not in useEffect[2][8].&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;The useEffect hook is essential for handling side effects in React functional components. By understanding its syntax, using the dependency array correctly, and following best practices, you can avoid common bugs and write more maintainable code. Remember to clean up after your effects, and don’t use useEffect for tasks that can be handled directly in render.&lt;/p&gt;




&lt;h2&gt;
  
  
  Let’s Discuss!
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Have you run into tricky bugs with useEffect?&lt;/li&gt;
&lt;li&gt;Do you have tips or patterns that work well for you?&lt;/li&gt;
&lt;li&gt;Any questions about dependencies or cleanup?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop your experiences and questions in the comments below!&lt;/p&gt;

&lt;p&gt;[1] &lt;a href="https://www.geeksforgeeks.org/reactjs-useeffect-hook/" rel="noopener noreferrer"&gt;https://www.geeksforgeeks.org/reactjs-useeffect-hook/&lt;/a&gt;&lt;br&gt;
[2] &lt;a href="https://www.zipy.ai/blog/useeffect-hook-guide" rel="noopener noreferrer"&gt;https://www.zipy.ai/blog/useeffect-hook-guide&lt;/a&gt;&lt;br&gt;
[3] &lt;a href="https://namastedev.com/blog/react-useeffect-hook-deep-dive-7/" rel="noopener noreferrer"&gt;https://namastedev.com/blog/react-useeffect-hook-deep-dive-7/&lt;/a&gt;&lt;br&gt;
[4] &lt;a href="https://www.w3schools.com/react/react_useeffect.asp" rel="noopener noreferrer"&gt;https://www.w3schools.com/react/react_useeffect.asp&lt;/a&gt;&lt;br&gt;
[5] &lt;a href="https://deadsimplechat.com/blog/react-useeffect-a-complete-guide-with-examples/" rel="noopener noreferrer"&gt;https://deadsimplechat.com/blog/react-useeffect-a-complete-guide-with-examples/&lt;/a&gt;&lt;br&gt;
[6] &lt;a href="https://www.developerupdates.com/blog/avoid-these-7-react-useeffect-mistakes" rel="noopener noreferrer"&gt;https://www.developerupdates.com/blog/avoid-these-7-react-useeffect-mistakes&lt;/a&gt;&lt;br&gt;
[7] &lt;a href="https://www.linkedin.com/pulse/useeffect-mastery-tips-tricks-avoiding-common-mistakes-novin-noori" rel="noopener noreferrer"&gt;https://www.linkedin.com/pulse/useeffect-mastery-tips-tricks-avoiding-common-mistakes-novin-noori&lt;/a&gt;&lt;br&gt;
[8] &lt;a href="https://dev.to/hkp22/reacts-useeffect-best-practices-pitfalls-and-modern-javascript-insights-g2f"&gt;https://dev.to/hkp22/reacts-useeffect-best-practices-pitfalls-and-modern-javascript-insights-g2f&lt;/a&gt;&lt;br&gt;
[9] &lt;a href="https://legacy.reactjs.org/docs/hooks-effect.html" rel="noopener noreferrer"&gt;https://legacy.reactjs.org/docs/hooks-effect.html&lt;/a&gt;&lt;br&gt;
[10] &lt;a href="https://blog.logrocket.com/useeffect-react-hook-complete-guide/" rel="noopener noreferrer"&gt;https://blog.logrocket.com/useeffect-react-hook-complete-guide/&lt;/a&gt;&lt;br&gt;
[11] &lt;a href="https://daveceddia.com/useeffect-hook-examples/" rel="noopener noreferrer"&gt;https://daveceddia.com/useeffect-hook-examples/&lt;/a&gt;&lt;br&gt;
[12] &lt;a href="https://www.telerik.com/blogs/7-common-mistakes-using-react-hooks" rel="noopener noreferrer"&gt;https://www.telerik.com/blogs/7-common-mistakes-using-react-hooks&lt;/a&gt;&lt;br&gt;
[13] &lt;a href="https://dmitripavlutin.com/react-useeffect-explanation/" rel="noopener noreferrer"&gt;https://dmitripavlutin.com/react-useeffect-explanation/&lt;/a&gt;&lt;br&gt;
[14] &lt;a href="https://www.geeksforgeeks.org/what-are-the-pitfalls-of-using-hooks-and-how-can-you-avoid-them/" rel="noopener noreferrer"&gt;https://www.geeksforgeeks.org/what-are-the-pitfalls-of-using-hooks-and-how-can-you-avoid-them/&lt;/a&gt;&lt;br&gt;
[15] &lt;a href="https://hygraph.com/blog/react-useeffect-a-complete-guide" rel="noopener noreferrer"&gt;https://hygraph.com/blog/react-useeffect-a-complete-guide&lt;/a&gt;&lt;br&gt;
[16] &lt;a href="https://blog.bitsrc.io/5-common-mistakes-when-using-useeffect-in-react-84c973060440" rel="noopener noreferrer"&gt;https://blog.bitsrc.io/5-common-mistakes-when-using-useeffect-in-react-84c973060440&lt;/a&gt;&lt;br&gt;
[17] &lt;a href="https://www.freecodecamp.org/news/react-hooks-useeffect-usestate-and-usecontext/" rel="noopener noreferrer"&gt;https://www.freecodecamp.org/news/react-hooks-useeffect-usestate-and-usecontext/&lt;/a&gt;&lt;br&gt;
[18] &lt;a href="https://akoskm.com/common-useeffect-mistakes/" rel="noopener noreferrer"&gt;https://akoskm.com/common-useeffect-mistakes/&lt;/a&gt;&lt;br&gt;
[19] &lt;a href="https://react.dev/reference/react/useEffect" rel="noopener noreferrer"&gt;https://react.dev/reference/react/useEffect&lt;/a&gt;&lt;br&gt;
[20] &lt;a href="https://overreacted.io/a-complete-guide-to-useeffect/" rel="noopener noreferrer"&gt;https://overreacted.io/a-complete-guide-to-useeffect/&lt;/a&gt;&lt;br&gt;
[21] &lt;a href="https://dev.to/colocodes/6-use-cases-of-the-useeffect-reactjs-hook-282o"&gt;https://dev.to/colocodes/6-use-cases-of-the-useeffect-reactjs-hook-282o&lt;/a&gt;&lt;br&gt;
[22] &lt;a href="https://www.youtube.com/watch?v=2l23TWMZFYk" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=2l23TWMZFYk&lt;/a&gt;&lt;br&gt;
[23] &lt;a href="https://brightmarbles.io/blog/useeffect-pitfalls/" rel="noopener noreferrer"&gt;https://brightmarbles.io/blog/useeffect-pitfalls/&lt;/a&gt;&lt;br&gt;
[24] &lt;a href="https://www.epicreact.dev/myths-about-useeffect" rel="noopener noreferrer"&gt;https://www.epicreact.dev/myths-about-useeffect&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>useeffect</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>USE STATE HOOK</title>
      <dc:creator>Srashti Gupta</dc:creator>
      <pubDate>Wed, 04 Jun 2025 07:19:35 +0000</pubDate>
      <link>https://dev.to/srashtigupta/use-state-hook-3hpp</link>
      <guid>https://dev.to/srashtigupta/use-state-hook-3hpp</guid>
      <description>&lt;p&gt;Here’s your improved blog post with a clear explanation and practical example of useState, making it even more helpful and approachable for readers:&lt;/p&gt;




&lt;h2&gt;
  
  
  Mastering State and Immutability in React Functional Components
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why I Wrote This Post
&lt;/h3&gt;

&lt;p&gt;As I dove deeper into React development, I often found myself puzzled by how state management works in functional components—especially when dealing with complex data types like arrays and objects. I wrote this post to share what I’ve learned about using the &lt;code&gt;useState&lt;/code&gt; hook effectively, and to help you avoid common pitfalls that can trip up even experienced developers. If you’re looking to write cleaner, more efficient React code, this guide is for you!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Setting a cover image helps your post stand out on the home feed and social media!&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Understanding State in React Functional Components
&lt;/h2&gt;

&lt;p&gt;React’s state is a powerful way to store and manage data within your components. In class components, you might use &lt;code&gt;this.state&lt;/code&gt;, but in functional components, React gives us hooks—especially the &lt;code&gt;useState&lt;/code&gt; hook.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is &lt;code&gt;useState&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;useState&lt;/code&gt; hook lets you add state to your functional components. It can hold any type of data: strings, numbers, booleans, arrays, objects, or even more complex structures[1][5][7]. Here’s how you can use it with different data types:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    &lt;span class="c1"&gt;// String&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setList&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;      &lt;span class="c1"&gt;// Array&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setObj&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;        &lt;span class="c1"&gt;// Object&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;     &lt;span class="c1"&gt;// Number&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;value&lt;/strong&gt;: The current state value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;setValue&lt;/strong&gt;: The function to update that state.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example: A Simple Counter
&lt;/h3&gt;

&lt;p&gt;Here’s a classic example to show how &lt;code&gt;useState&lt;/code&gt; works in practice—a button that counts how many times it’s clicked:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&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;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Declare a state variable named 'count', initialized to 0&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;

      &lt;span class="nx"&gt;You&lt;/span&gt; &lt;span class="nx"&gt;clicked&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;times&lt;/span&gt;
       &lt;span class="nf"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nx"&gt;Click&lt;/span&gt; &lt;span class="nx"&gt;me&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;ul&gt;
&lt;li&gt;
&lt;code&gt;useState(0)&lt;/code&gt; creates a state variable &lt;code&gt;count&lt;/code&gt; with an initial value of 0.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;setCount&lt;/code&gt; updates the value of &lt;code&gt;count&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Every button click increases the count by 1, and the UI updates automatically[3][4][5][6].&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Updating State
&lt;/h3&gt;

&lt;p&gt;Depending on your data type, you’ll update state like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nf"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                &lt;span class="c1"&gt;// Number&lt;/span&gt;
&lt;span class="nf"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;newValue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                      &lt;span class="c1"&gt;// String&lt;/span&gt;
&lt;span class="nf"&gt;setIsTrue&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="c1"&gt;// Boolean&lt;/span&gt;
&lt;span class="nf"&gt;setList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;newItem&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;       &lt;span class="c1"&gt;// Array&lt;/span&gt;
&lt;span class="nf"&gt;setObj&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;prev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Writer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt; &lt;span class="c1"&gt;// Object&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Key Principles
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Immutability:&lt;/strong&gt; Never mutate the original object or array. Always create a new copy with the necessary changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spread Operator (&lt;code&gt;...&lt;/code&gt;):&lt;/strong&gt; Use it to copy arrays and objects efficiently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Functional Updates:&lt;/strong&gt; When the new state depends on the previous state, use the functional form (e.g., &lt;code&gt;setState(prev =&amp;gt; ...)&lt;/code&gt;) for accuracy, especially with async updates.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why Immutability Matters for Performance
&lt;/h2&gt;

&lt;p&gt;Creating new references with &lt;code&gt;useState&lt;/code&gt; directly supports React’s shallow comparison strategy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Efficient Change Detection:&lt;/strong&gt; React can quickly tell if something changed by comparing references, not deep values.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimized Re-renders:&lt;/strong&gt; If the reference hasn’t changed, React skips unnecessary re-renders, improving performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimized Virtual DOM Diffing:&lt;/strong&gt; Only the parts of the UI that need to change are updated.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Pitfalls with the Spread Operator
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shallow Copy Only:&lt;/strong&gt; The spread operator only copies the top level. Nested objects or arrays are still referenced, which can lead to bugs if mutated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct Mutation Before Copy:&lt;/strong&gt; Accidentally mutating the original before copying (e.g., &lt;code&gt;arr.push(x)&lt;/code&gt; then &lt;code&gt;[...arr]&lt;/code&gt;) still mutates the original data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overusing Spread:&lt;/strong&gt; Excessive use can make code harder to read and, in rare cases, affect performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Order of Properties:&lt;/strong&gt; When merging objects, later properties override earlier ones—be mindful of the order.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;React’s &lt;code&gt;useState&lt;/code&gt; hook is a cornerstone for managing state in functional components. By following the principles of immutability and using the spread operator wisely, you can build robust, efficient, and bug-free applications.&lt;/p&gt;




&lt;h2&gt;
  
  
  Let’s Discuss!
&lt;/h2&gt;

&lt;p&gt;I’d love to hear from you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What challenges have you faced with state management in React?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do you have tips or best practices to share?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Any questions about immutability or the spread operator?&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drop your thoughts in the comments below—let’s spark a great discussion!&lt;/p&gt;

&lt;p&gt;[1] &lt;a href="https://www.w3schools.com/react/react_usestate.asp" rel="noopener noreferrer"&gt;https://www.w3schools.com/react/react_usestate.asp&lt;/a&gt;&lt;br&gt;
[2] &lt;a href="https://daveceddia.com/usestate-hook-examples/" rel="noopener noreferrer"&gt;https://daveceddia.com/usestate-hook-examples/&lt;/a&gt;&lt;br&gt;
[3] &lt;a href="https://legacy.reactjs.org/docs/hooks-state.html" rel="noopener noreferrer"&gt;https://legacy.reactjs.org/docs/hooks-state.html&lt;/a&gt;&lt;br&gt;
[4] &lt;a href="https://react.dev/reference/react/useState" rel="noopener noreferrer"&gt;https://react.dev/reference/react/useState&lt;/a&gt;&lt;br&gt;
[5] &lt;a href="https://blog.logrocket.com/guide-usestate-react/" rel="noopener noreferrer"&gt;https://blog.logrocket.com/guide-usestate-react/&lt;/a&gt;&lt;br&gt;
[6] &lt;a href="https://www.freecodecamp.org/news/usestate-hook-3-different-examples/" rel="noopener noreferrer"&gt;https://www.freecodecamp.org/news/usestate-hook-3-different-examples/&lt;/a&gt;&lt;br&gt;
[7] &lt;a href="https://hygraph.com/blog/usestate-react" rel="noopener noreferrer"&gt;https://hygraph.com/blog/usestate-react&lt;/a&gt;&lt;br&gt;
[8] &lt;a href="https://www.youtube.com/watch?v=O6P86uwfdR0" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=O6P86uwfdR0&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>usestate</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
