<?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: Gorlph</title>
    <description>The latest articles on DEV Community by Gorlph (@gorlph).</description>
    <link>https://dev.to/gorlph</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%2F424843%2F700cc268-628c-4ee9-9ee9-5acaeda43d13.png</url>
      <title>DEV Community: Gorlph</title>
      <link>https://dev.to/gorlph</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gorlph"/>
    <language>en</language>
    <item>
      <title> Static Type คืออะไร</title>
      <dc:creator>Gorlph</dc:creator>
      <pubDate>Tue, 04 Aug 2020 03:53:32 +0000</pubDate>
      <link>https://dev.to/gorlph/static-type-3ch</link>
      <guid>https://dev.to/gorlph/static-type-3ch</guid>
      <description>&lt;p&gt;กลุ่มเป้าหมายของบทความนี้คืออธิบายเครื่องมือทางเลือกสำหรับ Programmer, developer, software engineer มือใหม่ที่เริ่มต้นจากภาษายอดนิยมอย่าง เช่น Python และ JavaScript&lt;/p&gt;




&lt;p&gt;เคยเจ็บปวดรวดร้าวกับการที่ code base เริ่มขยายใหญ่ขึ้นเรื่อยๆ แล้วไม่รู้ว่า function รับตัวแปรเป็น type อะไร แล้วคืนค่าเป็น type อะไร หรือเป็น object หน้าตายังไง มี method อะไรให้เรียกใช้ จนต้องไปไล่หา code ทั้งโปรเจกต์ เพียงเพื่อจะต่อเติมเสริมสร้าง feature เล็กน้อยอันเดียวให้ถูกต้องกันรึเปล่า? แล้วเสียเวลากันไปเท่าไหร่? กู้หนี้ technical debt จนใกล้ล้มละลายกันมาบ้างมั้ย&lt;/p&gt;

&lt;p&gt;จะบรรเทาความเจ็บปวดเหล่านี้ยังไง? ทำ test ให้หมดไม่ได้เหรอ ก็อาจจะได้อยู่ แต่มันก็เยอะขึ้นตาม code base อยู่ดี และเขียน test ก็ต้องระวังเรื่อง type เองอยู่ดี...&lt;/p&gt;




&lt;h1&gt;
  
  
  Dynamic Type
&lt;/h1&gt;

&lt;p&gt;ปัญหาเหล่านี้มักเกิดขึ้นกับภาษาที่เป็น dynamic type ซึ่งเป็นภาษาที่ *&lt;em&gt;ตรวจสอบ type ช่วง run-time *&lt;/em&gt;  และมักจะไม่สามารถกำหนด type ของตัวแปรและค่าที่ได้จาก function โดยผู้เขียนเอง โดยถ้ามีการทำงานที่ผิดพลาดจากการทำงานผิดหลักของ type ก็มักจะพังตอนรันไปแล้ว&lt;br&gt;
และภาษาประเภทนี้มักเป็นที่นิยมของ developer, programmer หรือผู้ที่หัดเขียนโปรแกรมในปัจจุบัน เช่นภาษา Python และ JavaScript &lt;/p&gt;

&lt;p&gt;ในเมื่อมีปัญหาที่ว่ามา แล้วทำไมยังใช้ภาษาประเภทนี้กันอยู่? ก็มันไม่ได้เกิดปัญหานี้กับ code base ทุกที่ครับ  ที่จริงแล้วภาษาแบบ dynamic type มีข้อดีมากมาย(และทำให้เป็นที่นิยม) เช่น&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;เรียนรู้ได้เร็ว&lt;/li&gt;
&lt;li&gt;code ค่อนข้างกระชับ&lt;/li&gt;
&lt;li&gt;จัดการข้อมูลที่มีโครงสร้างซับซ้อนและลื่นไหลได้ง่าย &lt;/li&gt;
&lt;li&gt;ใช้เวลาเขียนค่อนข้างเร็วก็สามารถเข็น product ที่ใช้ได้ &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;และถ้า code base ไม่ได้ใหญ่มาก ก็ใช้การ test ทดสอบความถูกต้องได้มากอยู่&lt;/p&gt;


&lt;h2&gt;
  
  
  แล้วอธิบายภาษา dynamic type มาตั้งนานยังไม่อธิบายเลยว่า static type ในชื่อบทความคืออะไรเลย?
&lt;/h2&gt;

&lt;p&gt;ภาษา static type คือภาษาที่มี *&lt;em&gt;การตรวจสอบ type ตอน compile-time *&lt;/em&gt; นั่นเองครับ (ฮา) โดยภาษาประเภทนี้ หาก code มีการทำงานใดๆ ผิดหลัก ตัวโปรแกรมเองก็จะไม่สามารถรันได้เลย เช่น นำ string ไปคูณกับ integer, เรียกใช้ method ที่ไม่มีจริงของ object, เรียกใช้ function โดยใส่ argument ไม่ครบ เป็นต้น&lt;/p&gt;

&lt;p&gt;*** ทว่า แต่ละภาษาก็จะมี type ของข้อมูล และข้อกำหนดหรือข้อจำกัดรวมไปถึง feature ที่ต่างกันไป  โดยตัวอย่างภาษา static type ที่ผมสาธิตจะเป็นภาษา TypeScript version 3.9.7 ครับ ***&lt;/p&gt;
&lt;h3&gt;
  
  
  ตัวอย่างการกำหนด type ให้ตัวแปร, function ของภาษา TypeScript
&lt;/h3&gt;


&lt;div class="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;myNumber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="c1"&gt;// กำหนดประเภทของตัวแปรหลัง colon โดยในที่นี้ myNumber จะมี type เป็น number&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;myString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;some string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="c1"&gt;// เป็น string&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wrongType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;some number&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="c1"&gt;// เกิด error ไม่สามารถ assign ข้อมูล string ให้ตัวแปรที่เป็น number ได้&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;inferedNumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;span class="cm"&gt;/* ไม่ได้กำหนด type ของตัวแปร 
แต่ compiler มีการ infer (อนุมาน) type ของตัวแปร
จากข้อมูลที่ assign ให้ โดยในที่นี้จะเป็น number
*/&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;inferedString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;infered string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; 
&lt;span class="c1"&gt;// เช่นกัน inferedString จะมี type เป็น string&lt;/span&gt;


&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="cm"&gt;/* กำหนด type ให้ parameters ได้ 
และกำหนด type ของค่าที่ได้จาก function ได้ด้วย 
ในที่นี้ function multiply จะคืนข้อมูลเป็น number
*/&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;arrowFunctionMultiply&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&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;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="c1"&gt;// arrow function ก็กำหนดได้เช่นกัน&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;inferedFunctionReturnType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="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="nx"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="c1"&gt;// มีการ infer type ของค่าที่ return จากฟังก์ชันได้เช่นกัน&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  ตัวอย่างการใช้ operation กับ type ที่ไม่รองรับ ระหว่าง JavaScript กับ TypeScript
&lt;/h3&gt;

&lt;p&gt;JavaScript&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="c1"&gt;// 1&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="c1"&gt;// "A"&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="c1"&gt;// NaN&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;TypeScript&lt;br&gt;
&lt;/p&gt;

&lt;div class="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;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="cm"&gt;/* เกิด compile error -&amp;gt; The right-hand side of an arithmetic operation 
must be of type 'any', 'number', 'bigint' or an enum type 
และไม่สามารถ compile เพื่อรันได้
// ซึ่งก็คือ TypeScript ไม่อนุญาตให้ใช้ operator * ระหว่าง number กับ string 

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  ตัวอย่างการตรวจสอบการเรียก function ระหว่าง JavaScript กับ TypeScript
&lt;/h3&gt;

&lt;p&gt;JavaScript&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;c&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;multiply&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;//  1 undefined undefined และได้ค่า NaN&lt;/span&gt;

&lt;span class="nx"&gt;multiply&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 1 "2" "3" และได้ค่า NaN&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;TypeScript&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight typescript"&gt;&lt;code&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;multiply&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;// จะเกิด compile error -&amp;gt; Expected 3 arguments, but got 1. รันไม่ได้&lt;/span&gt;
&lt;span class="nx"&gt;multiply&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="cm"&gt;/*  compile error -&amp;gt; Argument of type '"2"' 
is not assignable to parameter of type 'number'
*/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  ตัวอย่างการเรียก method ที่ไม่มีอยู่จริง ระหว่าง JavaScript กับ TypeScript
&lt;/h3&gt;

&lt;p&gt;JavaScript&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;exampleString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This is a string.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;exampleString&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// "This is a string."&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;invalidOperation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;exampleString&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// โปรแกรมทำงาน แต่เกิด TypeError: exampleString.map is not a function&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;TypeScript&lt;br&gt;
&lt;/p&gt;

&lt;div class="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;exampleString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This is a string.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;exampleString&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;invalidOperation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;exampleString&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// เกิด compile error Property 'map' does not exist on type string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  ตัวอย่างของ "Gotcha" ในภาษา TypeScript
&lt;/h3&gt;



&lt;div class="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;exampleNumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// ได้ number&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;exampleString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;12&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// ได้ string&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;weirdGotcha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;exampleNumber&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;exampleString&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// จะได้string "1212" &lt;/span&gt;

&lt;span class="cm"&gt;/*
นี่เป็นตัวอย่างข้อยกเว้น ข้อควรระวัง ภาษา TypeScript เป็นภาษาที่ต่อยอดจาก JavaScript 
ซึ่ง number + string จะแปลง number เป็น string และนำมาต่อกัน  
โดยภาษา TypeScript ยังคงอนุญาตให้ใช้ number + string ได้
*/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;






&lt;h1&gt;
  
  
  ปิดท้าย
&lt;/h1&gt;

&lt;p&gt;จะเห็นได้ว่า ความผิดพลาดพื้นๆ ที่อาจเกิดขึ้นได้จากการที่ code base ใหญ่ขึ้นเช่นการเรียก method ผิด, เรียกใช้ function จาก module ผิดวิธี จะถูกจับไว้ก่อนจะได้รันโปรแกรมเสียอีก และถ้าใช้ code editor ที่รองรับการแสดงผล compiler, document ก็ยิ่งทำให้อ่านการใช้งานระหว่างการเขียนโค้ดได้อย่างทันท่วงที ชี้ไปที่ argument ของ function ก็เห็นเลยว่ามี method อะไรบ้าง    พอกันทีกับการที่โปรแกรมเราไปตายใน production เพียงเพราะเรียก method ผิด! พอกันทีกับการที่ต้องมานั่งดูโค้ดทั้งโปรเจ็กต์เพราะจำไม่ได้ว่า function ที่เขียนเดือนก่อนมันคืนค่าอะไรกลับมา!&lt;/p&gt;

&lt;p&gt;เพราะฉะนั้นแล้ว หันมาใช้ภาษา static ty-&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gekZ0Dsn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static1.srcdn.com/wordpress/wp-content/uploads/2020/05/Batman-Slapping-Robin-Meme-Explained.jpg%3Fq%3D50%26fit%3Dcrop%26w%3D960%26h%3D500%26dpr%3D1.5" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gekZ0Dsn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static1.srcdn.com/wordpress/wp-content/uploads/2020/05/Batman-Slapping-Robin-Meme-Explained.jpg%3Fq%3D50%26fit%3Dcrop%26w%3D960%26h%3D500%26dpr%3D1.5" alt="เดี๋ยวก่อน" title="ใจเย็นว้อย"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  ใจเย็น อย่าเพิ่ง Hype แล้วเอาไปใช้กับทุกอย่าง
&lt;/h1&gt;

&lt;p&gt;ภาษาประเภท static type ก็มีข้อเสียเช่นกัน เช่น&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;มักจะมีการ compile ทำให้เพิ่มเวลาในการ build app เพิ่ม&lt;/li&gt;
&lt;li&gt;ใช้เวลาเรียนรู้มากกว่า dynamic type &lt;/li&gt;
&lt;li&gt;จัดการข้อมูลที่มีโครงสร้างซับซ้อนและลื่นไหลได้ยากกว่า dynamic type (JSON แค่กๆ)&lt;/li&gt;
&lt;li&gt;code อาจจะยาวเยอะโดยไม่จำเป็น (verbose) ทำให้อ่านได้ช้า&lt;/li&gt;
&lt;li&gt;ต้องใช้เวลาในการเขียน code ในช่วงแรกนานกว่าแบบ dynamic type โดยจะเสียเวลาไปกับการตรวจสอบความถูกต้องก่อนจะรันได้ แลกกับการที่ต่อเติม code ได้ง่ายกว่าในระยะยาว จึงไม่ค่อยเหมาะกับโปรเจ็กต์ขนาดเล็กหรือ script เรียบง่ายที่ต้องการใช้เวลาพัฒนาสั้นๆ&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;กระนั้นแล้วข้อดีของภาษา static type นั้นก็ทำให้ code base มีการ maintain ที่ง่ายขึ้น ตัว code เองก็มีการตรวจสอบแล้วว่าต้องเรียกใช้งานอะไรยังไงบ้างโดยไม่ต้องพึ่งพา test  ลดปัญหาทางเทคนิคไปมากในระยะยาว แต่ก็ไม่ได้รับรองนะครับว่า code ที่เขียนไปมีพฤติกรรมทาง business ตามต้องการทั้งหมด&lt;/p&gt;

&lt;p&gt;ผู้พัฒนาและดูแลภาษา dynamic type ก็เห็นประโยชน์ดังกล่าว และได้เริ่มเพิ่มการตั้ง type ในภาษา dynamic type กันมากขึ้น โดยมักจะอยู่ในรูป type hint ซึ่งก็คือการเขียนคอมเมนต์ตามฟอร์แม็ตที่เจาะจง(decorator) เพื่อระบุ type, parameter ของ function &lt;br&gt;
&lt;a href="https://jsdoc.app/"&gt;JavaScript มี JSDoc&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.python.org/3/library/typing.html"&gt;Python มี Typing&lt;/a&gt;   &lt;/p&gt;

&lt;p&gt;บางภาษาก็เป็นลูกผสมเช่น C++ เป็นต้น&lt;/p&gt;




&lt;h1&gt;
  
  
  ปิดท้ายจริงแล้วครับ
&lt;/h1&gt;

&lt;p&gt;หวังว่าผู้อ่านจะเข้าใจ dynamic type กับ static type มากขึ้น และได้รู้ข้อดีข้อเสียเพื่อนำไปใช้งานที่เหมาะมากขึ้น &lt;/p&gt;

&lt;p&gt;ที่ปูกันมายาวแบบนี้ ก็เพื่อจะได้เขียนเรื่อง Interface ไว้เจอกันนะครับ!&lt;/p&gt;

&lt;p&gt;หมายเหตุ: ส่วนความ strongly typed กับ weakly typed นั้นไม่ได้มีความสัมพันธ์โดยตรงกับการเป็น static หรือ dynamic ครับ&lt;/p&gt;

&lt;p&gt;หมายเหตุ 2: ภาษา TypeScript เป็นภาษาต่อขยายจาก JavaScript โดย code ของมันจะ compile ไปเป็นภาษา JavaScript แล้วจึงรันด้วย JavaScript engine เช่น Browser ทั้งหลาย (V8 ของ Chrome, SpiderMonkey ของ Firefox), NodeJS &lt;/p&gt;

&lt;h1&gt;
  
  
  แก้ไขครั้งที่ 1
&lt;/h1&gt;

&lt;p&gt;มี feedback เรื่องความเร็วของภาษา static type กับภาษา dynamic type &lt;br&gt;
ความเร็วที่ถูกกล่าวถึงในโพสต์นี้มีเพียง "ความเร็วในการพัฒนา" เท่านั้นครับ  แต่ตอนเขียนข้อดีข้อเสียเปรียบเทียบกันผมก็ละเลยเรื่อง "ความเร็วตอนรัน" ไป&lt;/p&gt;

&lt;h2&gt;
  
  
  ความเร็วตอนรัน
&lt;/h2&gt;

&lt;p&gt;ภาษา static type นั้น &lt;em&gt;ส่วนมาก&lt;/em&gt; จะมีความเร็วตอนรันสูงกว่าภาษา dynamic type เพราะว่าภาษา dynamic type จะมีการตรวจสอบ type ตอนรัน ในขณะที่ภาษา static type จะไม่มีการตรวจสอบตอนรันแล้ว&lt;/p&gt;

&lt;h2&gt;
  
  
  กลับมาที่ความเร็วในการพัฒนา
&lt;/h2&gt;

&lt;p&gt;กราฟนี้อธิบายได้ดีมากครับ&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SNXAbLqj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/1%2AmGoThqiR2gd4HzNiltptMw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SNXAbLqj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/1%2AmGoThqiR2gd4HzNiltptMw.png" alt="comparison" title="the graph"&gt;&lt;/a&gt;&lt;br&gt;
Credit: miro.medium.com&lt;/p&gt;

&lt;p&gt;กราฟนี้ แกน X คือขนาดของ code base  ส่วนแกน Y คือ productivity ครับ&lt;/p&gt;

&lt;p&gt;ส่วนรายละเอียดของความเร็วในการพัฒนาที่แตกต่างกันระหว่างภาษาสองประเภทนี้ อาจจะยกไว้เป็นโพสต์อื่นนะครับ&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>engineering</category>
      <category>typescript</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
