# ==TypeScript== ## Do's and Don'ts --- ==General Types== --- ==ชนิดตัวแปร ที่ไม่ควรประกาศใน TypeScript== | Do | Don't | ความหมายของแต่ละประเภท | | -------- | -------- | -------- | | number | Number | ตัวเลข เช่น 1,2,3,4,..n | | string | String | ตัวอักษร เช่น ชื่อ นามสกุล | | boolean | Boolean | บูลีน เช่น true / false | | symbol | Symbol | สัญลักษณ์ :smile: | | object | Object | ข้อมูลแบบอ็อปเจ็ก เช่น {key:value}| --- ==ชนิดตัวแปร ที่ไม่ควรประกาศใน TypeScript== ตัวอย่าง ```javascript= /** wrong */ function foo(str: String): String; ``` ```javascript= /** OK */ function foo(str: string): string; ``` --- ==Callback Types== --- ==Return Types of Callbacks== <small>กรณีเป็น funtion ที่ไม่มีการคืนค่า (no return) อย่า return type **==any==** ให้ใช้ return type **==void==** แทน </small> ```javascript= /* WRONG */ function fn(x: () => any) { x(); } ``` ```javascript= /* OK */ function fn(x: () => void) { x(); } ``` --- <small> *** การใช้ void นั้นปลอดภัยกว่า เพราะมันจะป้องกันจากการ คืนค่าของ x ในวิธีที่ไม่ได้ตรวจสอบ ตัวอย่าง เช่น </small> ```javascript= function fn(x: () => void) { var k = x(); // oops! meant to do something else k.doSomething(); // error, // but would be OK if the return type had been 'any' } ``` --- ==Optional Parameters in Callbacks== --- >อย่าใช้ พารามิเตอร์ ที่เป็น optional ==(?)== ในการทำ callback >เว้นซะแต่ว่า เราตั้งใจเขียนให้มันเป็นแบบนั้นจริงๆ ตัวอย่าง ```javascript= /* WRONG */ interface Fetcher { getObject(done: (data: any, elapsedTime?: number) => void): void; } ``` ```javascript= /* OK */ interface Fetcher { getObject(done:(data: any, elapsedTime: number) => void): void; } ``` --- :::info <small> เหตุผลคือ : หลังจากที่ callback ทำงานเสร็จแล้ว อาจเป็นไปได้ว่า จะมีการเรียก argument 1 ตัว 2 ตัว ผู้เขียน (โปรแกรมเมอร์ ) อาจจะตั้งใจให้ callback ทำแบบนั้น แต่แย่สุดมีการประกาศ parameter elapsedTime มา แต่ไม่ได้สนใจ จะถูกใช้งาน หรือ ไม่ถูกใช้งานก็ได้ แต่ถ้าเป็นแบบนั้น เราก็ไม่ควรจะประกาศขึ้นมาเลยดีกว่า ถ้ามีการทำงานน้อย อาจจะไม่เห็นผลมากนัก ฉะนั้นควรเขียนให้มีประสิทธิภาพมากที่สุดตั้งแต่เริ่มดีกว่า </small> ::: --- ==Overloads and Callbacks== --- >อย่าเขียนติดกันแบบนี้ จริงๆไม่มีไรมาก คือ อ่านเเล้ว งง แตกต่างกันแค่ callback ==wtf== :-1: ```javascript= /* WRONG */ declare function beforeAll(action: () => void, timeout?: number): void; declare function beforeAll( action: (done: DoneFn) => void, timeout?: number ): void; ``` --- >มาเขียนแบบนี้กันดีกว่า code สะอาด อ่านก็ง่ายด้วย :+1: ```javascript= /* OK */ declare function beforeAll( action: (done: DoneFn) => void, timeout?: number ): void; ``` --- ==Function Overloads== --- ==Ordering== --- <small> อันนี้ก็ไม่มีไรมากนอกจากเรื่อง Performance แล้วก็คือ **ปวดหัว** เนี่ยแหละ ให้เขียนเรียงใหม่ เขียน type ที่เฉพาะเจาะจงไว้ก่อน เพราะว่าโปรแกรมมันอ่านจากบนลงล่าง </small> :-1: ```javascript= /* WRONG */ declare function fn(x: any): any; declare function fn(x: HTMLElement): number; declare function fn(x: HTMLDivElement): string; var myElem: HTMLDivElement; var x = fn(myElem); // x: any, wat? ``` --- <small>code เดิม เพิ่มเติมขึ้น Performance ดีขึ้น เขียนเรียงแบบนี้</small> :+1: ```javascript= /* OK */ declare function fn(x: HTMLDivElement): string; declare function fn(x: HTMLElement): number; declare function fn(x: any): any; var myElem: HTMLDivElement; var x = fn(myElem); // x: string, :) ``` --- ==Use Optional Parameters== --- <small>ไม่ควรเขียน overload โดยที่แตกต่างกันแค่ Param เยอะๆแบบนี้ นอกจากเรื่อง Performance ก็ ปวดหัวเนี่ยละ</small> :-1: ```javascript= /* WRONG */ interface Example { diff(one: string): number; diff(one: string, two: string): number; diff(one: string, two: string, three: boolean): number; } ``` --- <small> ถึงเวลาที่ต้องเอา optional (?) มาช่วยแบบเหมาะสมเเล้ว Good job! </small> :+1: ```javascript= /* OK */ interface Example { diff(one: string, two?: string, three?: boolean): number; } ``` --- ==Use Union Types== --- <small> กรณีที่ type ของ param แตกต่าง เราไม่ควรทำแบบนี้เลย มันดู ไก่กา มาก </small> :-1: ```javascript= /* WRONG */ interface Moment { utcOffset(): number; utcOffset(b: number): Moment; utcOffset(b: string): Moment; } ``` --- <small> ให้ใช้วิธีการ union type แบบนี้ ดูเป็นผู้เล่น Pro player ขึ้นมาทันที </small> :+1: ```javascript= /* OK */ interface Moment { utcOffset(): number; utcOffset(b: number | string): Moment; } ``` --- กรณีที่ผู้อ่าน อ่านแล้วไม่เข้า __เขียนไรวะเนี่ย ก็ขออภัยไว้ ณ ที่นี้เลยครับผม สามารถเข้าไปอ่านได้ที่ [Credit Link](https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html) --- ## The End ---
{"metaMigratedAt":"2023-06-15T05:20:47.687Z","metaMigratedFrom":"YAML","title":"==TypeScript==","breaks":true,"slideOptions":"{\"transition\":\"slide\"}","contributors":"[{\"id\":\"50acef50-3a9a-4a0c-afa0-1be3d0c7c8e8\",\"add\":5327,\"del\":556}]"}
    432 views