woowacourse-study / 2022-thanks-giving-effective-typescript

🍂추석 연휴 집중🍂 이펙티브 타입스크립트를 읽는 모임 (✌️완주완료✌️)
6 stars 0 forks source link

2022.09.13 #10

Closed moonheekim0118 closed 1 year ago

moonheekim0118 commented 1 year ago

https://www.youtube.com/watch?v=XrnQgWzsRVQ

고지가 얼마 안남았읍니다 여러분 화이팅

moonheekim0118 commented 1 year ago

타입스크립트 기능보다는 ECMAScript 기능을 사용하기

enum 열거형을 쓰면 안되는 이유

매개변수 속성

class Person {
   constructor(public name:string){}
}

그 외에도..

prefer2 commented 1 year ago

몽키 패치보다는 안전한 타입을 사용하기

객체에 임의의 속성을 추가하는 것은 side-effect를 야기할 수 있기 때문에 좋지 않다. 또한 타입스크립트까지 더하면 타입 체커는 내장 속성에 대해서는 알고 있지만, 임의로 추한 속성에 대해서는 알지 못한다.

(document as any).monkey = 'Tamarin'
interface Document {
  monkey: string;
}

document.monkey = 'Tamarin';
interface MonkeyDocument extends Document {
  monkey: string;
}

(document as MonkeyDocument).monkey = 'Macaque'

devDependencies에 typescript와 @types 추가하기

타입 선언과 관련된 세 가지 버전 이해하기

API 주석에 TSDoc 사용하기

사용자를 위한 문서라면 JSDoc 스타일의 주석을 만드는 것이 좋다. (/** */ 사용하기) 인라인 주석은 편집기가 표시해주지 않는다.

TSDoc에서는 @param과 @returns 같은 규칙을 사용할 수 있다.

TSDoc은 마크다운 형식으로 꾸며진다.

주석에는 타입 정보를 포함하면 안된다

콜백에서 this에 대한 타입 제공하기

this는 정의된 방식이 아니라 호출된 방식에 따라 달라진다.

this 바인딩 과정을 이해하고, 콜백 함수에서 this 를 사용해야 한다면 타입을 명시해주어야 한다.

function addKeyListener{
  el: HTMLElement,
    fn: (this: HTMLElement, e: (KeyboardEvent)=>void )
}

오버로딩 타입보다는 조건부 타입을 사용하기

function double(x: number|string): number | string;

const num = double(12) // string|number
const str = double('x') // string|number

위 선언문에는 number 타입을 매개변수로 넣고 string을 반환하는 경우와 string 타입을 매개변수로 넣고 number를 반환하는 경우가 포함되어 있다.

function double<T extends number|string>(x: T): T;
function double(x: any){ return x + x; }

const num = double(12) // 타입이 12
const str = double('x') // 타입이 'x', 'xx'도 아니고 'x'가 나온다

제너릭으로 모델링 할 수 있지만 너무 과하게 구체적이어진다.

function double(x: number): number;
function double(x: string): string;
function double(x: any) { return x + x; }

function f(x: string|number) {
  return double(x); // 'string'|'number' 형식의 인수는 'string' 형식의 매개변수에 할당될 수 없습니다.
}

여러 가지 타입 선언으로 분리하기.타입 스크립트에서 함수의 구현체는 하나지만, 타입 선언은 몇 개든지 만들 수 있다.

하지만 유니온 타입 관련해서는 문제가 발생한다.

function double<T extends number|string> (
    x: T
): T extends string ? string : number;

function double(x: any) { return x + x; }

function f(x: string|number) {
  return double(x); 
}
// (number|string) extends string ? string : number
// -> (number extends string ? string : number) | (string extends string ? string : number)
// number | string

조건부 타입 이용하기. 반환 타입이 더 정교하다.

의존성 분리를 위해 미러 타입 사용하기

테스팅 타입의 함정에 주의하기

liswktjs commented 1 year ago

마지막 4가지 정도는 정리하기 애매해서 키워드만 작성했습니다!

문서에 타입 정보를 쓰지 않기

타입 주변에 null 값 배치하기

function extent(nums: number[]){
    let min, max;
    for (const num of nums) {
        if(!min){
            min = num;
            max = num;
        } else {
            min = Math.min(min, num);
            max = Math.max(max, num); -> max는 이곳에서 number | undefined 가 될 수 있다
        }
    }
    return [min,max];
}

유니온 인터페이스 보다는 인터페이스의 유니온 사용하기

string 타입 보다 더 구체적인 타입 사용하기

type RecordingType = 'studio' | 'live';

부정확한 타입보다는 미완성 타입을 사용하기

데이터가 아닌 API와 명세를 보고 타입 만들기

해당 분양의 용어로 타입 이름 짓기

공식 명칭에는 상표를 붙이기

soyi47 commented 1 year ago

아이템 45. devDependencies에 typescript와 @types 추가하기

아이템 46. 타입 선언과 관련된 세 가지 버전 이해하기

아이템 47. 공개 API에 등장하는 모든 타입을 익스포트 하기

아이템 48. API 주석에 TSDoc 사용하기

아이템 49. 콜백에서 this에 대한 타입 제공하기

아이템 50. 오버로딩 타입보다는 조건부 타입을 사용하기

오버로팅 타입보다 조건부 타입을 사용하는 것이 좋다. 오버로딩 타입이 작성하기는 쉽지만, 조건부 타입은 개별 타입의 유니온으로 일반화하기 때문에 타입이 더 정확해진다. 오버로딩 타입을 작성 중이라면 조건부 타입으로 개선할 수 있을지 검토해 본다.

아이템 51. 의존성 분리를 위해 미러 타입 사용하기

작성 중인 라이브러리가 의존하는 라이브러리의 구현과 무관하게 타입에만 의존한다면, 필요한 선언부만 추출하여 작성 중인 라이브러리에 넣는 방식인 미러링(mirroring)을 고려해 보는 것도 좋다.

아이템 52. 테스팅 타입의 함정에 주의하기