<?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: Noah</title>
    <description>The latest articles on DEV Community by Noah (@noah-00).</description>
    <link>https://dev.to/noah-00</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1630586%2F2023459a-e32e-4c64-bbf4-60415b3ef315.png</url>
      <title>DEV Community: Noah</title>
      <link>https://dev.to/noah-00</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/noah-00"/>
    <language>en</language>
    <item>
      <title>Learn how to streamline UI implementation from Figma using Cursor + MCP Server. If you're tired of pixel-pushing manually, this guide is for you!</title>
      <dc:creator>Noah</dc:creator>
      <pubDate>Tue, 20 May 2025 19:22:23 +0000</pubDate>
      <link>https://dev.to/noah-00/learn-how-to-streamline-ui-implementation-from-figma-using-cursor-mcp-server-if-youre-tired-of-43lm</link>
      <guid>https://dev.to/noah-00/learn-how-to-streamline-ui-implementation-from-figma-using-cursor-mcp-server-if-youre-tired-of-43lm</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/noah-00/streamlining-ui-coding-from-figma-with-cursor-mcp-server-21oe" class="crayons-story__hidden-navigation-link"&gt;Streamlining UI Coding from Figma with Cursor &amp;amp; MCP Server&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/noah-00" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F1630586%2F2023459a-e32e-4c64-bbf4-60415b3ef315.png" alt="noah-00 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/noah-00" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Noah
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Noah
                
              
              &lt;div id="story-author-preview-content-2497590" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/noah-00" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F1630586%2F2023459a-e32e-4c64-bbf4-60415b3ef315.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Noah&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/noah-00/streamlining-ui-coding-from-figma-with-cursor-mcp-server-21oe" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 20 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/noah-00/streamlining-ui-coding-from-figma-with-cursor-mcp-server-21oe" id="article-link-2497590"&gt;
          Streamlining UI Coding from Figma with Cursor &amp;amp; MCP Server
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/noah-00/streamlining-ui-coding-from-figma-with-cursor-mcp-server-21oe" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;7&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/noah-00/streamlining-ui-coding-from-figma-with-cursor-mcp-server-21oe#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            6 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>ui</category>
      <category>mcp</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Streamlining UI Coding from Figma with Cursor &amp; MCP Server</title>
      <dc:creator>Noah</dc:creator>
      <pubDate>Tue, 20 May 2025 19:20:37 +0000</pubDate>
      <link>https://dev.to/noah-00/streamlining-ui-coding-from-figma-with-cursor-mcp-server-21oe</link>
      <guid>https://dev.to/noah-00/streamlining-ui-coding-from-figma-with-cursor-mcp-server-21oe</guid>
      <description>&lt;p&gt;Hello there!&lt;/p&gt;

&lt;p&gt;I’ve been working as a frontend engineer for 4 years, and I still feel that reproducing Figma designs pixel-perfectly can be a time-consuming and tough job sometimes.&lt;/p&gt;

&lt;p&gt;I always thought… if we could build perfect UI components or sections directly from Figma using AI, we could spend more time on creative and meaningful tasks. So, I decided to explore MCP Server + Cursor, which has been trending recently, and share the whole experiment with you all.&lt;/p&gt;

&lt;p&gt;By the way, I just started using Cursor and building things this way — so I’m still learning and exploring. Please feel free to share your feedback or ideas in the comments!&lt;/p&gt;




&lt;h2&gt;
  
  
  🔧 Tech Stack
&lt;/h2&gt;

&lt;p&gt;Design-to-Code Tools&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Figma MCP Server (&lt;a href="https://github.com/GLips/Figma-Context-MCP" rel="noopener noreferrer"&gt;https://github.com/GLips/Figma-Context-MCP&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Cursor (claude-3.7-sonnet)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Frontend Stack&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;li&gt;shadcn/ui&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;!Note:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This time, I experimented with using Figma-Context-MCP, but if I were to use it in a production environment, I would likely build my own MCP server for the following reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Since MCP is essentially an unofficial protocol, relying on an external, individually maintained implementation like GLips/Figma-Context-MCP introduces risk and is difficult to recommend for professional use.&lt;/li&gt;
&lt;li&gt;It appears that GLips/Figma-Context-MCP trims down the response from the Figma API—probably to reduce token usage—which led to missing information. For example, critical data such as componentProperties wasn't included, making it hard to leverage the design system effectively during implementation.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ Setup
&lt;/h2&gt;

&lt;p&gt;To set up the MCP Server, please refer to the following official resources:&lt;/p&gt;

&lt;p&gt;Cursor Official Docs (Model Context Protocol):&lt;br&gt;
&lt;a href="https://docs.cursor.com/context/model-context-protocol" rel="noopener noreferrer"&gt;https://docs.cursor.com/context/model-context-protocol&lt;/a&gt;&lt;br&gt;
Figma MCP Server GitHub Repository:&lt;br&gt;
&lt;a href="https://github.com/GLips/Figma-Context-MCP" rel="noopener noreferrer"&gt;https://github.com/GLips/Figma-Context-MCP&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Initial Test (Figma ↔ MCP Server ↔ Cursor)
&lt;/h2&gt;

&lt;p&gt;The Figma design I used is this beautiful &lt;a href="https://www.figma.com/community/file/1156860863353724933" rel="noopener noreferrer"&gt;SaaS Landing Page&lt;/a&gt;.&lt;br&gt;
Thanks to &lt;a href="https://www.figma.com/@alrazisiam" rel="noopener noreferrer"&gt;Al Razi Siam&lt;/a&gt; for sharing this amazing work!&lt;/p&gt;

&lt;p&gt;It’s a clean and simple landing page — perfect for trying AI-powered section-based coding.&lt;br&gt;
In today’s article, we’ll focus on implementing just the Header and Hero sections from this page.&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%2Fx3qqwpgrhctrnf3upjjp.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%2Fx3qqwpgrhctrnf3upjjp.png" alt="Image description" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To test if MCP Server works properly, I pasted the Figma link into the Cursor chat. And... it worked! Cursor was able to fetch the design through MCP Server.&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%2Fc0m4u4s6p3gn7p2r6res.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%2Fc0m4u4s6p3gn7p2r6res.png" alt="Image description" width="800" height="1353"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ Project Setup
&lt;/h2&gt;

&lt;p&gt;Since this article focuses on MCP Server, I’ll skip the full app setup, but here’s what I did briefly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Created a new Next.js project (&lt;a href="https://nextjs.org/docs/app/getting-started/installation" rel="noopener noreferrer"&gt;https://nextjs.org/docs/app/getting-started/installation&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Installed shadcn/ui (&lt;a href="https://ui.shadcn.com/docs/installation/next" rel="noopener noreferrer"&gt;https://ui.shadcn.com/docs/installation/next&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Cleaned up the initial project (removed unnecessary styles and assets)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Final clean state:&lt;br&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%2Fjvakjh5v7my95qr0m1dm.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%2Fjvakjh5v7my95qr0m1dm.png" alt="Image description" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 First Prompt Trial
&lt;/h2&gt;

&lt;p&gt;I just gave Cursor this prompt, no additional context:&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompt
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Please implement the design from the Figma file (&lt;a href="https://www.figma.com/design/OaWdNdbUeSNzj1lgYOmByC/Whitepace---SaaS-Landing-Page--Community-?node-id=9-6480&amp;amp;t=VKF4bLziXgKdQaaL-4" rel="noopener noreferrer"&gt;https://www.figma.com/design/OaWdNdbUeSNzj1lgYOmByC/Whitepace---SaaS-Landing-Page--Community-?node-id=9-6480&amp;amp;t=VKF4bLziXgKdQaaL-4&lt;/a&gt;) using React, Next.js, Tailwind CSS, and ShadcnUI.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And here is what it gave me (I trimmed everything except the header and hero sections):&lt;br&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%2F4vp1ted1c8jyu9lslroo.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%2F4vp1ted1c8jyu9lslroo.png" alt="Image description" width="800" height="256"&gt;&lt;/a&gt;&lt;br&gt;
Figma reference:&lt;br&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%2Fs3wkt7dag7h462pg573o.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%2Fs3wkt7dag7h462pg573o.png" alt="Image description" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Well, not perfect, but okay as a first try. Felt similar to what I got back when v0 came out 😅&lt;/p&gt;




&lt;h2&gt;
  
  
  🧱 Let’s Build Section by Section
&lt;/h2&gt;

&lt;p&gt;Header Section&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompt
&lt;/h3&gt;

&lt;p&gt;I used a “Copy link to selection” for just the header:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please implement the &lt;strong&gt;header section only&lt;/strong&gt; from the following Figma file using &lt;strong&gt;React&lt;/strong&gt;, &lt;strong&gt;Next.js&lt;/strong&gt;, &lt;strong&gt;Tailwind CSS&lt;/strong&gt;, and &lt;strong&gt;ShadcnUI&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.figma.com/design/OaWdNdbUeSNzj1lgYOmByC/Whitepace---SaaS-Landing-Page--Community-?node-id=9-7575&amp;amp;t=89b3o0KWCyQKxRlw-4" rel="noopener noreferrer"&gt;https://www.figma.com/design/OaWdNdbUeSNzj1lgYOmByC/Whitepace---SaaS-Landing-Page--Community-?node-id=9-7575&amp;amp;t=89b3o0KWCyQKxRlw-4&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Better! But...&lt;/p&gt;

&lt;h3&gt;
  
  
  Minor Issues:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Logos and icons weren’t quite right&lt;/li&gt;
&lt;li&gt;Spacing between text and icon was off&lt;/li&gt;
&lt;/ul&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%2Fcj2kvkdprz55h4ygymt6.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%2Fcj2kvkdprz55h4ygymt6.png" alt="Image description" width="800" height="784"&gt;&lt;/a&gt;&lt;br&gt;
Figma reference:&lt;br&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%2Fz44ltp4ec0pghr5lqc5a.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%2Fz44ltp4ec0pghr5lqc5a.png" alt="Image description" width="800" height="51"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Icon &amp;amp; Spacing Challenges
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Sometimes it doesn't reuse the same icon across components&lt;/li&gt;
&lt;li&gt;If an icon or logo is made of multiple layers, it often downloads them as separate SVGs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I added manual notes in the prompt:&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompt
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Please implement the &lt;strong&gt;header section only&lt;/strong&gt; from the following Figma file using &lt;strong&gt;React&lt;/strong&gt;, &lt;strong&gt;Next.js&lt;/strong&gt;, &lt;strong&gt;Tailwind CSS&lt;/strong&gt;, and &lt;strong&gt;ShadcnUI&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.figma.com/design/OaWdNdbUeSNzj1lgYOmByC/Whitepace---SaaS-Landing-Page--Community-?node-id=9-7575&amp;amp;t=89b3o0KWCyQKxRlw-4" rel="noopener noreferrer"&gt;https://www.figma.com/design/OaWdNdbUeSNzj1lgYOmByC/Whitepace---SaaS-Landing-Page--Community-?node-id=9-7575&amp;amp;t=89b3o0KWCyQKxRlw-4&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Additional Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use Tailwind CSS utility classes to match spacing, font sizes, colors, and layout precisely.&lt;/li&gt;
&lt;li&gt;For icons, use ones in /public/icons, not raw SVGs or third-party libraries.&lt;/li&gt;
&lt;li&gt;For images, use assets in /public/images.&lt;/li&gt;
&lt;li&gt;Prefer &lt;strong&gt;shadcn/ui&lt;/strong&gt; components. Install with:
&lt;code&gt;npx shadcn@latest add [component-name]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;I also manually downloaded image assets into /public/images.&lt;br&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%2Fs0db454jyxc3uub0qhnt.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%2Fs0db454jyxc3uub0qhnt.png" alt="Image description" width="462" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And finally…&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%2Fwf97obh9nwtk2xn9bjk0.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%2Fwf97obh9nwtk2xn9bjk0.png" alt="Image description" width="800" height="784"&gt;&lt;/a&gt;&lt;br&gt;
Figma reference:&lt;br&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%2Fykpl4ujq9gc9i69o2sar.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%2Fykpl4ujq9gc9i69o2sar.png" alt="Image description" width="800" height="51"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It looks good but there's still a problem.&lt;/p&gt;

&lt;p&gt;In the Figma file, spacing between menu text and icon was 10px.&lt;br&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%2F0hk20z18ihk4hto2bf1q.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%2F0hk20z18ihk4hto2bf1q.png" alt="Image description" width="800" height="427"&gt;&lt;/a&gt;&lt;br&gt;
But Tailwind’s gap-2 = 8px. So the spacing was slightly off:&lt;br&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%2Fkdlyukrs4846yp4tthd8.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%2Fkdlyukrs4846yp4tthd8.png" alt="Image description" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I adjusted the prompt as below to solve the issue mentioned above.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompt
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Please implement the &lt;strong&gt;header section only&lt;/strong&gt; from the following Figma file using &lt;strong&gt;React&lt;/strong&gt;, &lt;strong&gt;Next.js&lt;/strong&gt;, &lt;strong&gt;Tailwind CSS&lt;/strong&gt;, and &lt;strong&gt;ShadcnUI&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.figma.com/design/OaWdNdbUeSNzj1lgYOmByC/Whitepace---SaaS-Landing-Page--Community-?node-id=9-7575&amp;amp;t=89b3o0KWCyQKxRlw-4" rel="noopener noreferrer"&gt;https://www.figma.com/design/OaWdNdbUeSNzj1lgYOmByC/Whitepace---SaaS-Landing-Page--Community-?node-id=9-7575&amp;amp;t=89b3o0KWCyQKxRlw-4&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Additional Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use Tailwind CSS utility classes to match spacing, font sizes, colors, and layout as closely as possible to the Figma design.
Prefer predefined utility classes (e.g., p-2, mt-4) when available.
If an exact match isn't available, use Tailwind's arbitrary value syntax (e.g., p-[10px], gap-[18px]) to follow the Figma design precisely.&lt;/li&gt;
&lt;li&gt;For icons, please use the ones provided in the /public/icons directory. Avoid using raw SVGs or third-party icon libraries.&lt;/li&gt;
&lt;li&gt;For images, use assets located in the /public/images directory.&lt;/li&gt;
&lt;li&gt;When implementing UI elements, prioritize using &lt;strong&gt;ShadcnUI components&lt;/strong&gt;.
If a component is not found in &lt;code&gt;/components/ui&lt;/code&gt;, install it using the command:
&lt;code&gt;npx shadcn@latest add [component-name]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Finally, the Figma design was faithfully reproduced.&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%2Fek4n1g8t0wso6i5krkic.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%2Fek4n1g8t0wso6i5krkic.png" alt="Image description" width="800" height="522"&gt;&lt;/a&gt;&lt;br&gt;
Figma design again:&lt;br&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%2Fpjr3xdzpd1beq8qszlz9.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%2Fpjr3xdzpd1beq8qszlz9.png" alt="Image description" width="800" height="51"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I checked it using Chrome DevTools, and the spacing, line height, and colors were all implemented exactly as in the original design.&lt;/p&gt;

&lt;p&gt;Also, necessary components like button and dropdown-menu were properly imported from shadcn/ui, and with just a little bit of refactoring, the code looked good enough to be used in a real-world project.&lt;/p&gt;

&lt;p&gt;If you're curious, feel free to check out the repository: &lt;a href="https://github.com/noah-00/coding-by-mcp" rel="noopener noreferrer"&gt;https://github.com/noah-00/coding-by-mcp&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  💥 Hero Section
&lt;/h2&gt;

&lt;p&gt;Prompt was same, just the node-id changed:&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompt
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Please implement the &lt;strong&gt;Hero-section only&lt;/strong&gt; from the following Figma file using &lt;strong&gt;React&lt;/strong&gt;, &lt;strong&gt;Next.js&lt;/strong&gt;, &lt;strong&gt;Tailwind CSS&lt;/strong&gt;, and &lt;strong&gt;ShadcnUI&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.figma.com/design/OaWdNdbUeSNzj1lgYOmByC/Whitepace---SaaS-Landing-Page--Community-?node-id=9-6481&amp;amp;t=lZSdRVDVqKLJHy0M-4" rel="noopener noreferrer"&gt;https://www.figma.com/design/OaWdNdbUeSNzj1lgYOmByC/Whitepace---SaaS-Landing-Page--Community-?node-id=9-6481&amp;amp;t=lZSdRVDVqKLJHy0M-4&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Additional Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use Tailwind CSS utility classes to match spacing, font sizes, colors, and layout as closely as possible to the Figma design.
Prefer predefined utility classes (e.g., p-2, mt-4) when available.
If an exact match isn't available, use Tailwind's arbitrary value syntax (e.g., p-[10px], gap-[18px]) to follow the Figma design precisely.&lt;/li&gt;
&lt;li&gt;For icons, please use the ones provided in the /public/icons directory. Avoid using raw SVGs or third-party icon libraries.&lt;/li&gt;
&lt;li&gt;For images, use assets located in the /public/images directory.&lt;/li&gt;
&lt;li&gt;When implementing UI elements, prioritize using &lt;strong&gt;ShadcnUI components&lt;/strong&gt;.
If a component is not found in &lt;code&gt;/components/ui&lt;/code&gt;, install it using the command:
&lt;code&gt;npx shadcn@latest add [component-name]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Everything looked perfect — except for the background image.&lt;/p&gt;

&lt;p&gt;It seems that recognizing and placing images correctly is still a bit challenging.&lt;br&gt;
If anyone has more insights or tips on this, I’d really appreciate it if you could share!&lt;/p&gt;

&lt;p&gt;Output:&lt;br&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%2Fa0x04b7drxq43lu9bd74.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%2Fa0x04b7drxq43lu9bd74.png" alt="Image description" width="800" height="522"&gt;&lt;/a&gt;&lt;br&gt;
↓ Background image didn’t render properly. I fixed it manually 😅&lt;br&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%2Fo3vdprykuc74v87j9ynl.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%2Fo3vdprykuc74v87j9ynl.png" alt="Image description" width="800" height="522"&gt;&lt;/a&gt;&lt;br&gt;
Figma reference:&lt;br&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%2Fys4ryl1qvdyae4dv0o7k.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%2Fys4ryl1qvdyae4dv0o7k.png" alt="Image description" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;I didn’t implement the full page, but just with good prompts, I was able to build a section in under 5 minutes (for example, the Hero section).&lt;/p&gt;

&lt;p&gt;There are still issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When I asked it to make the layout responsive, sometimes it broke already working parts.&lt;/li&gt;
&lt;li&gt;It's decent at 0→1, but hard to do precise edits without breaking other things.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That said, for simple sections or components, Cursor + MCP Server gives very solid results — especially with thoughtful prompt engineering.&lt;/p&gt;

&lt;p&gt;At the company I work for, we also saw an improvement in the quality of AI-generated code by defining basic rules under the .cursor/rules directory.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;As I said, I’m still a beginner in prompt engineering, so any tips or feedback are super welcome. Let’s learn and improve together.&lt;/p&gt;

&lt;p&gt;Source code: &lt;a href="https://github.com/noah-00/coding-by-mcp" rel="noopener noreferrer"&gt;https://github.com/noah-00/coding-by-mcp&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Happy coding☀️&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🙌 I'm still learning prompt engineering, so feedback and suggestions are very welcome!</title>
      <dc:creator>Noah</dc:creator>
      <pubDate>Sat, 17 May 2025 19:03:36 +0000</pubDate>
      <link>https://dev.to/noah-00/im-still-learning-prompt-engineering-so-feedback-and-suggestions-are-very-welcome-1a38</link>
      <guid>https://dev.to/noah-00/im-still-learning-prompt-engineering-so-feedback-and-suggestions-are-very-welcome-1a38</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/noah-00/modern-ui-development-with-ai-coding-figma-designs-via-cursor-mcp-server-155m" class="crayons-story__hidden-navigation-link"&gt;Streamlining UI Coding from Figma with Cursor &amp;amp; MCP Server&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/noah-00" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F1630586%2F2023459a-e32e-4c64-bbf4-60415b3ef315.png" alt="noah-00 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/noah-00" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Noah
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Noah
                
              
              &lt;div id="story-author-preview-content-2495670" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/noah-00" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F1630586%2F2023459a-e32e-4c64-bbf4-60415b3ef315.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Noah&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/noah-00/modern-ui-development-with-ai-coding-figma-designs-via-cursor-mcp-server-155m" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 17 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/noah-00/modern-ui-development-with-ai-coding-figma-designs-via-cursor-mcp-server-155m" id="article-link-2495670"&gt;
          Streamlining UI Coding from Figma with Cursor &amp;amp; MCP Server
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/react"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;react&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/nextjs"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;nextjs&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/vibecoding"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;vibecoding&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/frontend"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;frontend&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/noah-00/modern-ui-development-with-ai-coding-figma-designs-via-cursor-mcp-server-155m" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;5&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/noah-00/modern-ui-development-with-ai-coding-figma-designs-via-cursor-mcp-server-155m#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            6 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>react</category>
      <category>nextjs</category>
      <category>vibecoding</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Streamlining UI Coding from Figma with Cursor &amp; MCP Server</title>
      <dc:creator>Noah</dc:creator>
      <pubDate>Sat, 17 May 2025 18:53:16 +0000</pubDate>
      <link>https://dev.to/noah-00/modern-ui-development-with-ai-coding-figma-designs-via-cursor-mcp-server-155m</link>
      <guid>https://dev.to/noah-00/modern-ui-development-with-ai-coding-figma-designs-via-cursor-mcp-server-155m</guid>
      <description>&lt;p&gt;Hello there!&lt;/p&gt;

&lt;p&gt;I’ve been working as a frontend engineer for 4 years, and I still feel that reproducing Figma designs pixel-perfectly can be a time-consuming and tough job sometimes.&lt;/p&gt;

&lt;p&gt;I always thought… if we could build perfect UI components or sections directly from Figma using AI, we could spend more time on creative and meaningful tasks. So, I decided to explore MCP Server + Cursor, which has been trending recently, and share the whole experiment with you all.&lt;/p&gt;

&lt;p&gt;By the way, I just started using Cursor and building things this way — so I’m still learning and exploring. Please feel free to share your feedback or ideas in the comments!&lt;/p&gt;




&lt;h2&gt;
  
  
  🔧 Tech Stack
&lt;/h2&gt;

&lt;p&gt;Design-to-Code Tools&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Figma MCP Server (&lt;a href="https://github.com/GLips/Figma-Context-MCP" rel="noopener noreferrer"&gt;https://github.com/GLips/Figma-Context-MCP&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Cursor (claude-3.7-sonnet)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Frontend Stack&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;li&gt;shadcn/ui&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;!Note:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This time, I experimented with using Figma-Context-MCP, but if I were to use it in a production environment, I would likely build my own MCP server for the following reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Since MCP is essentially an unofficial protocol, relying on an external, individually maintained implementation like GLips/Figma-Context-MCP introduces risk and is difficult to recommend for professional use.&lt;/li&gt;
&lt;li&gt;It appears that GLips/Figma-Context-MCP trims down the response from the Figma API—probably to reduce token usage—which led to missing information. For example, critical data such as componentProperties wasn't included, making it hard to leverage the design system effectively during implementation.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ Setup
&lt;/h2&gt;

&lt;p&gt;To set up the MCP Server, please refer to the following official resources:&lt;/p&gt;

&lt;p&gt;Cursor Official Docs (Model Context Protocol):&lt;br&gt;
&lt;a href="https://docs.cursor.com/context/model-context-protocol" rel="noopener noreferrer"&gt;https://docs.cursor.com/context/model-context-protocol&lt;/a&gt;&lt;br&gt;
Figma MCP Server GitHub Repository:&lt;br&gt;
&lt;a href="https://github.com/GLips/Figma-Context-MCP" rel="noopener noreferrer"&gt;https://github.com/GLips/Figma-Context-MCP&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Initial Test (Figma ↔ MCP Server ↔ Cursor)
&lt;/h2&gt;

&lt;p&gt;The Figma design I used is this beautiful &lt;a href="https://www.figma.com/community/file/1156860863353724933" rel="noopener noreferrer"&gt;SaaS Landing Page&lt;/a&gt;.&lt;br&gt;
Thanks to &lt;a href="https://www.figma.com/@alrazisiam" rel="noopener noreferrer"&gt;Al Razi Siam&lt;/a&gt; for sharing this amazing work!&lt;/p&gt;

&lt;p&gt;It’s a clean and simple landing page — perfect for trying AI-powered section-based coding.&lt;br&gt;
In today’s article, we’ll focus on implementing just the Header and Hero sections from this page.&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%2Fx3qqwpgrhctrnf3upjjp.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%2Fx3qqwpgrhctrnf3upjjp.png" alt="Image description" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To test if MCP Server works properly, I pasted the Figma link into the Cursor chat. And... it worked! Cursor was able to fetch the design through MCP Server.&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%2Fc0m4u4s6p3gn7p2r6res.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%2Fc0m4u4s6p3gn7p2r6res.png" alt="Image description" width="800" height="1353"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ Project Setup
&lt;/h2&gt;

&lt;p&gt;Since this article focuses on MCP Server, I’ll skip the full app setup, but here’s what I did briefly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Created a new Next.js project (&lt;a href="https://nextjs.org/docs/app/getting-started/installation" rel="noopener noreferrer"&gt;https://nextjs.org/docs/app/getting-started/installation&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Installed shadcn/ui (&lt;a href="https://ui.shadcn.com/docs/installation/next" rel="noopener noreferrer"&gt;https://ui.shadcn.com/docs/installation/next&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Cleaned up the initial project (removed unnecessary styles and assets)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Final clean state:&lt;br&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%2Fjvakjh5v7my95qr0m1dm.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%2Fjvakjh5v7my95qr0m1dm.png" alt="Image description" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 First Prompt Trial
&lt;/h2&gt;

&lt;p&gt;I just gave Cursor this prompt, no additional context:&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompt
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Please implement the design from the Figma file (&lt;a href="https://www.figma.com/design/OaWdNdbUeSNzj1lgYOmByC/Whitepace---SaaS-Landing-Page--Community-?node-id=9-6480&amp;amp;t=VKF4bLziXgKdQaaL-4" rel="noopener noreferrer"&gt;https://www.figma.com/design/OaWdNdbUeSNzj1lgYOmByC/Whitepace---SaaS-Landing-Page--Community-?node-id=9-6480&amp;amp;t=VKF4bLziXgKdQaaL-4&lt;/a&gt;) using React, Next.js, Tailwind CSS, and ShadcnUI.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And here is what it gave me (I trimmed everything except the header and hero sections):&lt;br&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%2F4vp1ted1c8jyu9lslroo.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%2F4vp1ted1c8jyu9lslroo.png" alt="Image description" width="800" height="256"&gt;&lt;/a&gt;&lt;br&gt;
Figma reference:&lt;br&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%2Fs3wkt7dag7h462pg573o.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%2Fs3wkt7dag7h462pg573o.png" alt="Image description" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Well, not perfect, but okay as a first try. Felt similar to what I got back when v0 came out 😅&lt;/p&gt;




&lt;h2&gt;
  
  
  🧱 Let’s Build Section by Section
&lt;/h2&gt;

&lt;p&gt;Header Section&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompt
&lt;/h3&gt;

&lt;p&gt;I used a “Copy link to selection” for just the header:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please implement the &lt;strong&gt;header section only&lt;/strong&gt; from the following Figma file using &lt;strong&gt;React&lt;/strong&gt;, &lt;strong&gt;Next.js&lt;/strong&gt;, &lt;strong&gt;Tailwind CSS&lt;/strong&gt;, and &lt;strong&gt;ShadcnUI&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.figma.com/design/OaWdNdbUeSNzj1lgYOmByC/Whitepace---SaaS-Landing-Page--Community-?node-id=9-7575&amp;amp;t=89b3o0KWCyQKxRlw-4" rel="noopener noreferrer"&gt;https://www.figma.com/design/OaWdNdbUeSNzj1lgYOmByC/Whitepace---SaaS-Landing-Page--Community-?node-id=9-7575&amp;amp;t=89b3o0KWCyQKxRlw-4&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Better! But...&lt;/p&gt;

&lt;h3&gt;
  
  
  Minor Issues:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Logos and icons weren’t quite right&lt;/li&gt;
&lt;li&gt;Spacing between text and icon was off&lt;/li&gt;
&lt;/ul&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%2Fcj2kvkdprz55h4ygymt6.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%2Fcj2kvkdprz55h4ygymt6.png" alt="Image description" width="800" height="784"&gt;&lt;/a&gt;&lt;br&gt;
Figma reference:&lt;br&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%2Fz44ltp4ec0pghr5lqc5a.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%2Fz44ltp4ec0pghr5lqc5a.png" alt="Image description" width="800" height="51"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Icon &amp;amp; Spacing Challenges
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Sometimes it doesn't reuse the same icon across components&lt;/li&gt;
&lt;li&gt;If an icon or logo is made of multiple layers, it often downloads them as separate SVGs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I added manual notes in the prompt:&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompt
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Please implement the &lt;strong&gt;header section only&lt;/strong&gt; from the following Figma file using &lt;strong&gt;React&lt;/strong&gt;, &lt;strong&gt;Next.js&lt;/strong&gt;, &lt;strong&gt;Tailwind CSS&lt;/strong&gt;, and &lt;strong&gt;ShadcnUI&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.figma.com/design/OaWdNdbUeSNzj1lgYOmByC/Whitepace---SaaS-Landing-Page--Community-?node-id=9-7575&amp;amp;t=89b3o0KWCyQKxRlw-4" rel="noopener noreferrer"&gt;https://www.figma.com/design/OaWdNdbUeSNzj1lgYOmByC/Whitepace---SaaS-Landing-Page--Community-?node-id=9-7575&amp;amp;t=89b3o0KWCyQKxRlw-4&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Additional Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use Tailwind CSS utility classes to match spacing, font sizes, colors, and layout precisely.&lt;/li&gt;
&lt;li&gt;For icons, use ones in /public/icons, not raw SVGs or third-party libraries.&lt;/li&gt;
&lt;li&gt;For images, use assets in /public/images.&lt;/li&gt;
&lt;li&gt;Prefer &lt;strong&gt;shadcn/ui&lt;/strong&gt; components. Install with:
&lt;code&gt;npx shadcn@latest add [component-name]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;I also manually downloaded image assets into /public/images.&lt;br&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%2Fs0db454jyxc3uub0qhnt.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%2Fs0db454jyxc3uub0qhnt.png" alt="Image description" width="462" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And finally…&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%2Fwf97obh9nwtk2xn9bjk0.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%2Fwf97obh9nwtk2xn9bjk0.png" alt="Image description" width="800" height="784"&gt;&lt;/a&gt;&lt;br&gt;
Figma reference:&lt;br&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%2Fykpl4ujq9gc9i69o2sar.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%2Fykpl4ujq9gc9i69o2sar.png" alt="Image description" width="800" height="51"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It looks good but there's still a problem.&lt;/p&gt;

&lt;p&gt;In the Figma file, spacing between menu text and icon was 10px.&lt;br&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%2F0hk20z18ihk4hto2bf1q.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%2F0hk20z18ihk4hto2bf1q.png" alt="Image description" width="800" height="427"&gt;&lt;/a&gt;&lt;br&gt;
But Tailwind’s gap-2 = 8px. So the spacing was slightly off:&lt;br&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%2Fkdlyukrs4846yp4tthd8.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%2Fkdlyukrs4846yp4tthd8.png" alt="Image description" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I adjusted the prompt as below to solve the issue mentioned above.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompt
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Please implement the &lt;strong&gt;header section only&lt;/strong&gt; from the following Figma file using &lt;strong&gt;React&lt;/strong&gt;, &lt;strong&gt;Next.js&lt;/strong&gt;, &lt;strong&gt;Tailwind CSS&lt;/strong&gt;, and &lt;strong&gt;ShadcnUI&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.figma.com/design/OaWdNdbUeSNzj1lgYOmByC/Whitepace---SaaS-Landing-Page--Community-?node-id=9-7575&amp;amp;t=89b3o0KWCyQKxRlw-4" rel="noopener noreferrer"&gt;https://www.figma.com/design/OaWdNdbUeSNzj1lgYOmByC/Whitepace---SaaS-Landing-Page--Community-?node-id=9-7575&amp;amp;t=89b3o0KWCyQKxRlw-4&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Additional Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use Tailwind CSS utility classes to match spacing, font sizes, colors, and layout as closely as possible to the Figma design.
Prefer predefined utility classes (e.g., p-2, mt-4) when available.
If an exact match isn't available, use Tailwind's arbitrary value syntax (e.g., p-[10px], gap-[18px]) to follow the Figma design precisely.&lt;/li&gt;
&lt;li&gt;For icons, please use the ones provided in the /public/icons directory. Avoid using raw SVGs or third-party icon libraries.&lt;/li&gt;
&lt;li&gt;For images, use assets located in the /public/images directory.&lt;/li&gt;
&lt;li&gt;When implementing UI elements, prioritize using &lt;strong&gt;ShadcnUI components&lt;/strong&gt;.
If a component is not found in &lt;code&gt;/components/ui&lt;/code&gt;, install it using the command:
&lt;code&gt;npx shadcn@latest add [component-name]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Finally, the Figma design was faithfully reproduced.&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%2Fek4n1g8t0wso6i5krkic.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%2Fek4n1g8t0wso6i5krkic.png" alt="Image description" width="800" height="522"&gt;&lt;/a&gt;&lt;br&gt;
Figma design again:&lt;br&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%2Fpjr3xdzpd1beq8qszlz9.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%2Fpjr3xdzpd1beq8qszlz9.png" alt="Image description" width="800" height="51"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I checked it using Chrome DevTools, and the spacing, line height, and colors were all implemented exactly as in the original design.&lt;/p&gt;

&lt;p&gt;Also, necessary components like button and dropdown-menu were properly imported from shadcn/ui, and with just a little bit of refactoring, the code looked good enough to be used in a real-world project.&lt;/p&gt;

&lt;p&gt;If you're curious, feel free to check out the repository: &lt;a href="https://github.com/noah-00/coding-by-mcp" rel="noopener noreferrer"&gt;https://github.com/noah-00/coding-by-mcp&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  💥 Hero Section
&lt;/h2&gt;

&lt;p&gt;Prompt was same, just the node-id changed:&lt;/p&gt;

&lt;h3&gt;
  
  
  Prompt
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Please implement the &lt;strong&gt;Hero-section only&lt;/strong&gt; from the following Figma file using &lt;strong&gt;React&lt;/strong&gt;, &lt;strong&gt;Next.js&lt;/strong&gt;, &lt;strong&gt;Tailwind CSS&lt;/strong&gt;, and &lt;strong&gt;ShadcnUI&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.figma.com/design/OaWdNdbUeSNzj1lgYOmByC/Whitepace---SaaS-Landing-Page--Community-?node-id=9-6481&amp;amp;t=lZSdRVDVqKLJHy0M-4" rel="noopener noreferrer"&gt;https://www.figma.com/design/OaWdNdbUeSNzj1lgYOmByC/Whitepace---SaaS-Landing-Page--Community-?node-id=9-6481&amp;amp;t=lZSdRVDVqKLJHy0M-4&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Additional Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use Tailwind CSS utility classes to match spacing, font sizes, colors, and layout as closely as possible to the Figma design.
Prefer predefined utility classes (e.g., p-2, mt-4) when available.
If an exact match isn't available, use Tailwind's arbitrary value syntax (e.g., p-[10px], gap-[18px]) to follow the Figma design precisely.&lt;/li&gt;
&lt;li&gt;For icons, please use the ones provided in the /public/icons directory. Avoid using raw SVGs or third-party icon libraries.&lt;/li&gt;
&lt;li&gt;For images, use assets located in the /public/images directory.&lt;/li&gt;
&lt;li&gt;When implementing UI elements, prioritize using &lt;strong&gt;ShadcnUI components&lt;/strong&gt;.
If a component is not found in &lt;code&gt;/components/ui&lt;/code&gt;, install it using the command:
&lt;code&gt;npx shadcn@latest add [component-name]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Everything looked perfect — except for the background image.&lt;/p&gt;

&lt;p&gt;It seems that recognizing and placing images correctly is still a bit challenging.&lt;br&gt;
If anyone has more insights or tips on this, I’d really appreciate it if you could share!&lt;/p&gt;

&lt;p&gt;Output:&lt;br&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%2Fa0x04b7drxq43lu9bd74.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%2Fa0x04b7drxq43lu9bd74.png" alt="Image description" width="800" height="522"&gt;&lt;/a&gt;&lt;br&gt;
↓ Background image didn’t render properly. I fixed it manually 😅&lt;br&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%2Fo3vdprykuc74v87j9ynl.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%2Fo3vdprykuc74v87j9ynl.png" alt="Image description" width="800" height="522"&gt;&lt;/a&gt;&lt;br&gt;
Figma reference:&lt;br&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%2Fys4ryl1qvdyae4dv0o7k.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%2Fys4ryl1qvdyae4dv0o7k.png" alt="Image description" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;I didn’t implement the full page, but just with good prompts, I was able to build a section in under 5 minutes (for example, the Hero section).&lt;/p&gt;

&lt;p&gt;There are still issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When I asked it to make the layout responsive, sometimes it broke already working parts.&lt;/li&gt;
&lt;li&gt;It's decent at 0→1, but hard to do precise edits without breaking other things.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That said, for simple sections or components, Cursor + MCP Server gives very solid results — especially with thoughtful prompt engineering.&lt;/p&gt;

&lt;p&gt;At the company I work for, we also saw an improvement in the quality of AI-generated code by defining basic rules under the .cursor/rules directory.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

&lt;p&gt;As I said, I’m still a beginner in prompt engineering, so any tips or feedback are super welcome. Let’s learn and improve together.&lt;/p&gt;

&lt;p&gt;Source code: &lt;a href="https://github.com/noah-00/coding-by-mcp" rel="noopener noreferrer"&gt;https://github.com/noah-00/coding-by-mcp&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Happy coding☀️&lt;/p&gt;

</description>
      <category>react</category>
      <category>nextjs</category>
      <category>vibecoding</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Difference between router.push, &lt;Link&gt; and &lt;a&gt; in Next.js</title>
      <dc:creator>Noah</dc:creator>
      <pubDate>Sat, 07 Dec 2024 23:41:26 +0000</pubDate>
      <link>https://dev.to/noah-00/difference-between-routerpush-and-in-nextjs-2pmg</link>
      <guid>https://dev.to/noah-00/difference-between-routerpush-and-in-nextjs-2pmg</guid>
      <description>&lt;p&gt;Here’s a brief overview of the differences in behavior among the three.&lt;/p&gt;

&lt;h1&gt;
  
  
  router.push
&lt;/h1&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%2Fmvnl15irftmg88zf8772.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%2Fmvnl15irftmg88zf8772.png" alt="explanation about router.push component in next.js" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;router.push&lt;/code&gt; doesn't generate &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; tags, so its behavior is similar to &lt;code&gt;window.location&lt;/code&gt;. This means that if you're concerned about SEO, your links might not be detected by crawlers.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;router.push&lt;/code&gt; is mostly used in an event handler (onClick here). This is an action. So let's say you click on the button, then you do some task, and based on the result you take the user to another page. Then you'd want to use &lt;code&gt;router.push&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;code&gt;&amp;lt;Link&amp;gt;&lt;/code&gt;
&lt;/h1&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%2Frf2v1juoivu6rjxa9luc.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%2Frf2v1juoivu6rjxa9luc.png" alt="explanation about &amp;lt;Link&amp;gt; component in next.js" width="800" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the other hand, &lt;code&gt;&amp;lt;Link&amp;gt;&lt;/code&gt; generate &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; tags. which means your links will be detected when crawlers scrape your site. &lt;br&gt;
End users can still navigate without reloading the page, just like in a Single Page App.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;&amp;lt;Link&amp;gt;&lt;/code&gt; component also includes prefetching.&lt;br&gt;
This means all pages linked to by any &lt;code&gt;&amp;lt;Link&amp;gt;&lt;/code&gt; in the viewport or hovered on are loaded in advance, ready to be displayed when clicked on.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;
&lt;/h1&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%2F1d5xpad4gd4x8twr2gz6.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%2F1d5xpad4gd4x8twr2gz6.png" alt="explanation about &amp;lt;a&amp;gt; component in next.js" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; tag without using next/link's &lt;code&gt;&amp;lt;Link&amp;gt;&lt;/code&gt; creates a standard hyperlink which directs end user to the url as a new page. (standard behavior).&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;&lt;em&gt;router.push&lt;/em&gt;&lt;/strong&gt;:&lt;/u&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Used for programmatic navigation, similar to window.location, and doesn't generate &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; tags, so it might not be SEO-friendly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;u&gt;&lt;em&gt;&lt;strong&gt;&lt;code&gt;&amp;lt;Link&amp;gt;&lt;/code&gt;&lt;/strong&gt;&lt;/em&gt;:&lt;/u&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Generates &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; tags, making it SEO-friendly and supports prefetching for better performance in Single Page Applications.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;u&gt;&lt;em&gt;&lt;strong&gt;&lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;&lt;/strong&gt;&lt;/em&gt;:&lt;/u&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Standard HTML hyperlink, reloads the page entirely and doesn't leverage Next.js routing optimizations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You should use &lt;code&gt;&amp;lt;Link&amp;gt;&lt;/code&gt; throughout your website.&lt;br&gt;
However, if you need to redirect users to another page based on the result of a process, you can use &lt;code&gt;router.push&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Happy Coding☀️&lt;/p&gt;

</description>
    </item>
    <item>
      <title>No more Try/Catch: a better way to handle errors in TypeScript</title>
      <dc:creator>Noah</dc:creator>
      <pubDate>Mon, 04 Nov 2024 23:46:22 +0000</pubDate>
      <link>https://dev.to/noah-00/no-more-trycatch-a-better-way-to-handle-errors-in-typescript-5hbd</link>
      <guid>https://dev.to/noah-00/no-more-trycatch-a-better-way-to-handle-errors-in-typescript-5hbd</guid>
      <description>&lt;p&gt;Hello everyone.&lt;/p&gt;

&lt;p&gt;Have you ever felt that Try/Catch is a bit inconvenient when developing an application in TypeScript?&lt;/p&gt;

&lt;p&gt;I found an intersting video on YouTube that describes how to handle errors in TypeScript in a simple way.&lt;br&gt;
I'm sharing insights from &lt;a href="https://www.youtube.com/watch?v=AdmGHwvgaVs" rel="noopener noreferrer"&gt;the video&lt;/a&gt; as a review.&lt;/p&gt;

&lt;p&gt;If you have any other good alternatives to try/catch, I would love to hear them!&lt;/p&gt;
&lt;h2&gt;
  
  
  Defining the getUser function for error handling
&lt;/h2&gt;

&lt;p&gt;First of all, I defined a simple getUser function to illustrate error handling.&lt;br&gt;
It returns a new user with the given id.&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;wait&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;duration&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&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;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&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="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;duration&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &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="kr"&gt;number&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;await&lt;/span&gt; &lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&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="nx"&gt;id&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;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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;404 - User does not exist&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="k"&gt;return&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="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;Noah&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&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;getUser&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="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;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// { id: 1, name: "Noah" }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Error Handling using try/catch
&lt;/h2&gt;

&lt;p&gt;Rewriting the previous code using try/catch, it looks like this.&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;wait&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;duration&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="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="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &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="kr"&gt;number&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="err"&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;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;user&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;getUser&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="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;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// { id: 1, name: "Noah" }&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;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;There was an error&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;h2&gt;
  
  
  Problem with try/catch ①: It handles every error that occurs within the try block
&lt;/h2&gt;

&lt;p&gt;The code below is not ideal.&lt;br&gt;
Even though it's just a typo, "There was an error" is displayed in the console. I only want to handle errors that occur specifically in getUser within this try/catch block.&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;wait&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;duration&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="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="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &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="kr"&gt;number&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="err"&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;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;user&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;getUser&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="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;usr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;              &lt;span class="err"&gt;　&lt;/span&gt;&lt;span class="c1"&gt;// ← There was an error&lt;/span&gt;
  &lt;span class="c1"&gt;// ... (a lot of code)&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;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;There was an error&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;h2&gt;
  
  
  Problem with try/catch ②: The Pitfall of Using let
&lt;/h2&gt;

&lt;p&gt;Okay then, let's try to solve it using &lt;code&gt;let&lt;/code&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;const&lt;/span&gt; &lt;span class="nx"&gt;wait&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;duration&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="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="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &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="kr"&gt;number&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="err"&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;let&lt;/span&gt; &lt;span class="nx"&gt;user&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="nx"&gt;user&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;getUser&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="c1"&gt;// ... (a lot of code)&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;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;There was an error&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;usr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ← ReferenceError: Can't find variable: usr&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I got an actual error from the typo, but this code is still not ideal because I can accidentally redefine the user object, like below.&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;wait&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;duration&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="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="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &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="kr"&gt;number&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="err"&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;let&lt;/span&gt; &lt;span class="nx"&gt;user&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="nx"&gt;user&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;getUser&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="c1"&gt;// ... (a lot of code)&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;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;There was an error&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;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;// ← ❌ It might lead to a bug.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;It's much simpler and more readable, don't you think?&lt;br&gt;
Furthermore, the user variable is immutable and won't lead to unexpected errors.&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;wait&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;duration&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="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="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &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="kr"&gt;number&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="err"&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;catchError&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&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;promise&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;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="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kc"&gt;undefined&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;|&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;&amp;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;return&lt;/span&gt; &lt;span class="nx"&gt;promise&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&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="o"&gt;=&amp;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="kc"&gt;undefined&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="k"&gt;as&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kc"&gt;undefined&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="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="o"&gt;=&amp;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="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="kd"&gt;const&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="nx"&gt;user&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;catchError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getUser&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;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;log&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;log&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Please take a look at &lt;a href="https://www.youtube.com/watch?v=AdmGHwvgaVs" rel="noopener noreferrer"&gt;the video&lt;/a&gt;, which we have referenced. He explains it very carefully.&lt;/p&gt;

&lt;p&gt;I have never actually used this pattern in actual work.I just wanted to hear your opinion on how practical it is.Because it was discussed in his Yotube comments and I wanted to know the answer. I’ll be exploring best practices based on the comments.👍&lt;/p&gt;

&lt;p&gt;Happy Coding☀️&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>TypeScript Adventures with type-challenges – Day 1: Pick</title>
      <dc:creator>Noah</dc:creator>
      <pubDate>Wed, 09 Oct 2024 18:08:49 +0000</pubDate>
      <link>https://dev.to/noah-00/typescript-adventures-with-type-challenges-day-1-pick-5fdj</link>
      <guid>https://dev.to/noah-00/typescript-adventures-with-type-challenges-day-1-pick-5fdj</guid>
      <description>&lt;p&gt;Hello everyone.&lt;br&gt;
I'm working through &lt;a href="https://github.com/type-challenges/type-challenges/tree/main" rel="noopener noreferrer"&gt;type-challenges&lt;/a&gt; to dive deeper into TypeScript.&lt;/p&gt;

&lt;p&gt;Today, I’d like to share what I learned about the &lt;a href="https://github.com/type-challenges/type-challenges/blob/main/questions/00004-easy-pick/README.md" rel="noopener noreferrer"&gt;Pick&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  - The challenge -
&lt;/h2&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;Todo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;completed&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="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;TodoPreview&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;MyPick&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Todo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;title&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="s1"&gt;completed&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;const&lt;/span&gt; &lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TodoPreview&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Clean room&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;completed&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Implement the built-in Pick generic without using it.&lt;br&gt;
Constructs a type by picking the set of properties K from T.&lt;/p&gt;

&lt;h2&gt;
  
  
  - Description -
&lt;/h2&gt;

&lt;p&gt;The challenge is to create your own version of the &lt;code&gt;Pick&lt;/code&gt; utility type, which TypeScript provide as a standard utility.&lt;/p&gt;

&lt;h2&gt;
  
  
  - My solution -
&lt;/h2&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;Todo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;title&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;description&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;completed&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="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;MyPick&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="kd"&gt;extends&lt;/span&gt; &lt;span class="kr"&gt;keyof&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="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="nx"&gt;U&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;k&lt;/span&gt;&lt;span class="p"&gt;];&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;TodoPreview&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;MyPick&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Todo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&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;completed&lt;/span&gt;&lt;span class="dl"&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;const&lt;/span&gt; &lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TodoPreview&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Clean room&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;completed&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="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  - Explanation -
&lt;/h2&gt;

&lt;p&gt;Let me explain, line by line.&lt;/p&gt;

&lt;p&gt;On the first line, MyPick receives two arguments: &lt;code&gt;T&lt;/code&gt; and &lt;code&gt;U extends keyof T&lt;/code&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%2Fq2iyuo4io0p372f6qa2q.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%2Fq2iyuo4io0p372f6qa2q.png" alt="Image description" width="800" height="620"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;T&lt;/code&gt;：The base type that includes all properties.&lt;br&gt;
&lt;code&gt;U extends keyof T&lt;/code&gt;：Specifies the properties to include in the output type.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/docs/handbook/2/keyof-types.html" rel="noopener noreferrer"&gt;About keyof&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.typescriptlang.org/docs/handbook/2/objects.html#extending-types" rel="noopener noreferrer"&gt;About extends&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the second line, &lt;br&gt;
It creates a new type which extracts only the specified properties from the given argument.&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%2Fy9jtxenhz2y6gni1fr9b.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%2Fy9jtxenhz2y6gni1fr9b.png" alt="Image description" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.typescriptlang.org/docs/handbook/2/mapped-types.html" rel="noopener noreferrer"&gt;About Mapped Types such as [k in U]&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see below, a new type that excludes &lt;code&gt;description&lt;/code&gt; from &lt;code&gt;Todo&lt;/code&gt; is created by providing only &lt;code&gt;title&lt;/code&gt; and &lt;code&gt;completed&lt;/code&gt; to &lt;code&gt;MyPick&lt;/code&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%2Fd7xk8n06biwmvgr6evlz.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%2Fd7xk8n06biwmvgr6evlz.png" alt="Image description" width="800" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy Coding☀️&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>coding</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>The difference between readonly and const in Type Script</title>
      <dc:creator>Noah</dc:creator>
      <pubDate>Thu, 22 Aug 2024 02:44:44 +0000</pubDate>
      <link>https://dev.to/noah-00/the-difference-between-readonly-and-const-in-type-script-3po3</link>
      <guid>https://dev.to/noah-00/the-difference-between-readonly-and-const-in-type-script-3po3</guid>
      <description>&lt;p&gt;These two features are similar in that they are both non-assignable.&lt;/p&gt;

&lt;p&gt;Can you explain exactly it?&lt;/p&gt;

&lt;p&gt;In this article, I will share the differences between them.&lt;/p&gt;

&lt;h2&gt;
  
  
  const prevents reassignment to a variable.
&lt;/h2&gt;

&lt;p&gt;In this case, &lt;code&gt;hisName&lt;/code&gt; is a variable that cannot be reassigned.&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;hisName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Michael Scofield&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="nx"&gt;hisName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lincoln Burrows&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="c1"&gt;// → ❌ Cannot assign to 'hisName' because it is a constant.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, you can reassign to property.&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;hisFamily&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;brother&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lincoln Burrows&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;hisFamily&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;brother&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
&lt;span class="c1"&gt;// → ⭕️&lt;/span&gt;

&lt;span class="nx"&gt;hisFamily&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;mother&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Christina Rose Scofield&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// → ❌ Cannot assign to 'hisFamily' because it is a constant.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  readonly prevents reassignment to a property.
&lt;/h2&gt;

&lt;p&gt;For example, if you try to assign a value to &lt;code&gt;brother&lt;/code&gt; with &lt;code&gt;readonly&lt;/code&gt;, a compilation error will occur.&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;hisFamily&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;brother&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="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;brother&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lincoln Burrows&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;hisFamily&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;brother&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
&lt;span class="c1"&gt;// → ❌ Cannot assign to 'brother' because it is a read-only property.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the other hand, assigning to the variable itself is allowed.&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;hisFamily&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;brother&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="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;brother&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lincoln Burrows&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;hisFamily&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;brother&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;// → ⭕️&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;&lt;code&gt;const&lt;/code&gt; makes the variable itself non-assignable, while &lt;code&gt;readonly&lt;/code&gt; makes the property non-assignable.&lt;/p&gt;

&lt;p&gt;By combining &lt;code&gt;const&lt;/code&gt; and &lt;code&gt;readonly&lt;/code&gt;, you can create an object where both the variable itself and the object's properties are immutable.&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;hisFamily&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;brother&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="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;brother&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lincoln Burrows&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;hisFamily&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;brother&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
&lt;span class="c1"&gt;// ❌ Cannot assign to 'brother' because it is a read-only property.&lt;/span&gt;

&lt;span class="nx"&gt;hisFamily&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;brother&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;// ❌ Cannot assign to 'hisFamily' because it is a constant.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Happy Coding☀️&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Cautions When Using readonly in TypeScript</title>
      <dc:creator>Noah</dc:creator>
      <pubDate>Sat, 10 Aug 2024 12:56:16 +0000</pubDate>
      <link>https://dev.to/noah-00/cautions-when-using-readonly-in-typescript-22d7</link>
      <guid>https://dev.to/noah-00/cautions-when-using-readonly-in-typescript-22d7</guid>
      <description>&lt;h2&gt;
  
  
  The basic of readonly property
&lt;/h2&gt;

&lt;p&gt;In Type Script, you can make the object of the properties of an object read-only.&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;person&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;readonly&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="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="s1"&gt;Mike&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;person&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="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// → Cannot assign to 'name' because it is a read-only property.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;u&gt;⚠️① readonly is only at compile-time&lt;/u&gt;
&lt;/h2&gt;

&lt;p&gt;In the compiled JavaScript code, the readonly declaration is removed, so it will not be detected as an error at runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;u&gt;⚠️② readonly is not recursive.&lt;/u&gt;
&lt;/h2&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;person&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;readonly&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="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;academicBackground&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;primarySchool&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="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="s1"&gt;Mike&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;academicBackground&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;primarySchool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;School A&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;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;academicBackground&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;primarySchool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;School B&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="c1"&gt;// You can change `person.academicBackground.primarySchool`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to make it read-only, also you need to put readonly to &lt;code&gt;primarySchool&lt;/code&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;const&lt;/span&gt; &lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;readonly&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="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;academicBackground&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;primarySchool&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="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="s1"&gt;Mike&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;academicBackground&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;primarySchool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;School A&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;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;academicBackground&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;primarySchool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;School B&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="c1"&gt;// → Cannot assign to 'primarySchool' because it is a read-only property.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Readonly
&lt;/h2&gt;

&lt;p&gt;When the number of properties increases, adding readonly to each one becomes cumbersome and increases the amount of code.&lt;br&gt;
You can refactor by using Readonly.&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;obj&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;readonly&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;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;readonly&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;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;c&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="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;d&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="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;b&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;c&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// ↓&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Readonly&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;a&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;b&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;c&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;d&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="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;b&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;c&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;d&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;Happy Coding☀️&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>What is different between undefined and null in Java Script</title>
      <dc:creator>Noah</dc:creator>
      <pubDate>Wed, 10 Jul 2024 11:47:56 +0000</pubDate>
      <link>https://dev.to/noah-00/what-is-different-between-undefined-and-null-in-java-script-1mdf</link>
      <guid>https://dev.to/noah-00/what-is-different-between-undefined-and-null-in-java-script-1mdf</guid>
      <description>&lt;p&gt;I introduce that what is different between &lt;code&gt;undefined&lt;/code&gt; and &lt;code&gt;null&lt;/code&gt; because   it is difficult to describe it exactly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the Difference between undefined and null
&lt;/h2&gt;

&lt;p&gt;In many programming languages, there is usually one way to represent "no value," such as null.&lt;br&gt;
However, in JavaScript, there are two ways to represent "no value": &lt;code&gt;null&lt;/code&gt; and &lt;code&gt;undefined&lt;/code&gt;. This can be surprising and confusing for people coming to JavaScript from other languages.&lt;/p&gt;
&lt;h2&gt;
  
  
  💡Basics
&lt;/h2&gt;
&lt;h3&gt;
  
  
  null
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;null&lt;/code&gt; doesn't occur unless programmer Intentionally uses it.&lt;/p&gt;
&lt;h3&gt;
  
  
  undefined
&lt;/h3&gt;

&lt;p&gt;On the other hand, &lt;code&gt;undefined&lt;/code&gt; occurs naturally, even if you don't use it explicitly. &lt;/p&gt;

&lt;p&gt;For example, if you declare a variable and it has no initial value, JavaScript will assign &lt;code&gt;undefined&lt;/code&gt; to it.&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;test&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;test&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// → undefined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When accessing the property that doesn't exist in a object or the element that is not in array, it will automatically became undefined.&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;object&lt;/span&gt; &lt;span class="o"&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;object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// → undefined&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt; &lt;span class="o"&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;array&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;// → undefined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔍JSON
&lt;/h2&gt;

&lt;h3&gt;
  
  
  undefined
&lt;/h3&gt;

&lt;p&gt;When you use &lt;code&gt;undefined&lt;/code&gt; for the value of an object's property and then convert that object to JSON using JSON.stringify, the property is removed from the JSON output.&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="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;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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="c1"&gt;// → {}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  null
&lt;/h3&gt;

&lt;p&gt;On the other hand, when the value of property is &lt;code&gt;null&lt;/code&gt;, it will retained .&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="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;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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="c1"&gt;// → {"name": null}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;It is easier to unify with &lt;code&gt;undefined&lt;/code&gt; because &lt;code&gt;undefined&lt;/code&gt; occurs naturally everywhere.&lt;/p&gt;

&lt;p&gt;Happy Coding☀️&lt;/p&gt;

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