TS스터디 이펙티브 item28~30

온호성·2023년 4월 14일
0

🤕item 28 유효한 상태만 표현하는 타입을 지향하기

ts에서 유효한 상태만 표현하는 타입을 지향하는 것은 코드의 안정성과 유지보수성을 높이기 위한 방법 중 하나이다.

ts에서는 정적 타입 시스템을 사용하여 코드에서 발생할 수 있는 에러를 미리 체크할 수 있는데 이를 통해 코드의 안정성을 높일 수 있다. 하지만, 타입 시스템이 모든 경우를 다루지는 못하기 때문에, 프로그래머는 타입의 정확성을 유지하면서도 무효한 상태를 표현할 수 있는 타입을 작성할 수 있다.

예를 들어

interface User {
  name: string;
  age: number;
}

function createUser(name: string, age: number): User {
  return { name, age };
}

이 코드는 User 타입을 정의하고, createUser 함수를 통해 User 객체를 생성한다. 하지만, createUser 함수는 무효한 상태를 허용합니다. 즉, age 매개변수가 음수일 수도 있습니다. 이러한 경우를 방지하기 위해서는 createUser 함수에서 무효한 상태를 체크하여 예외를 발생시키는 것이 좋습니다.

또한, User 타입에서도 유효하지 않은 상태를 허용하는 경우가 있습니다. 예를 들어, age 속성이 음수일 수 있습니다. 이러한 경우를 방지하기 위해서는 User 타입에서 age 속성이 항상 양수임을 보장하는 타입을 지정해주는 것이 좋다.

따라서, ts에서는 코드에서 무효한 상태를 허용하지 않는 것이 좋다. 무효한 상태를 허용하는 경우 코드에서 에러가 발생할 가능성이 높아지며, 유지보수성이 떨어진다.

따라서, 유효한 상태만을 표현하는 타입을 지향하여 안정성과 유지보수성을 높이는 것이 좋다.

또 다른 예시

interface State{
    a: string;
    b?: string;
    c?: string;
}// 유효한 상태와 무효한 상태를 둘다 표현하는 타입

이를 유효한 상태만 표현하게 바꾼 모습이

interface StateCase1{
    a: string;
}

interface StateCase2{
    a: string;
    b: string;
}

interface StateCase3{
    a: string;
    c: string;
}

interface StateCase4{
    a: string;
    b: string;
    c: string;
}

type State =  StateCase1 | StateCase2 | StateCase3 | StateCase4

코드가 길어지거나 표현하기 어렵지만 결국은 시간을 절약하고 고통을 줄일 수 있다.

🤓item 29 사용할 때는 너그럽게, 생성할 때는 엄격하게

TCP와 관련해서 존 포스텔이 쓴 견고성 원칙 또는 포스텔의 법칙이 있는데

"TCP 구현체는 견고성의 일반적 원칙을 따라야 한다. 당신의 작업은 엄격하게 하고, 다른 사람의 작업은 너그럽게 받아들여야 한다."

ts에서는 "너그럽게 (loose)"와 "엄격하게 (strict)" 두 가지 모드를 제공한다. 이 모드는 타입 검사의 엄격성을 조절하는데 사용된다.

  • 너그럽게 (loose): 타입 검사를 덜 엄격하게 수행한다. 즉, 코드에서 타입 에러가 발생할 가능성이 높은 경우에도 경고 없이 컴파일을 허용하는 것이다. 이 모드는 코드 작성을 더 편하게 만들어주며, ts를 처음 사용하는 경우 추천된다. 너그럽게 모드는 tsconfig.json 파일에서 strict 옵션을 false로 설정하면 활성화된다.

  • 엄격하게 (strict): 타입 검사를 엄격하게 수행한다. 즉, 코드에서 타입 에러가 발생할 가능성이 있는 경우 컴파일을 허용하지 않는다. 이 모드는 코드의 안정성을 높여주며, 유지보수성을 향상시키는데 도움을 준다. 엄격하게 모드는 tsconfig.json 파일에서 strict 옵션을 true로 설정하면 활성화된다.

일반적으로, 코드 작성 시에는 너그럽게 모드를 사용하여 개발 속도를 높이고, 코드 배포 시에는 엄격하게 모드를 사용하여 코드의 안정성을 보장하는 것이 좋습니다. 따라서, tsconfig.json 파일에서는 다음과 같이 설정할 수 있습니다.

이렇게 설정하면, 코드 작성 시에는 너그럽게 모드로 개발을 할 수 있고, 코드 배포 시에는 엄격하게 모드로 빌드하여 안정성을 보장할 수 있다.

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

코드와 주석이 맞지 않는다면, 둘 다 잘못된 것이다.

ts의 타입 구문 시스템은 간결하고, 구체적이며, 쉽게 읽을 수 있도록 설계되었다. 함수의 입력과 출력의 타입을 코드로 표현하는 것이 주석보다 더 나은 방법이라는 것은 분명하다.

ts에서는 문서에 타입 정보를 적지 않아도 타입 정보를 추론할 수 있는 경우가 많다. 이러한 경우에는 문서에 타입 정보를 적지 않아도 충분한 타입 검사를 수행할 수 있다. 따라서, 코드의 가독성을 높이기 위해 문서에 타입 정보를 쓰지 않을 수 있습니다.

예를 들어,

function add(a: number, b: number): number {
  return a + b;
}

이 함수는 두 개의 number 타입의 매개변수를 받아서 number 타입의 결과를 반환한다. 따라서, 이 함수의 타입 정보는 함수의 선언부에서 이미 명시되어 있다. 이 경우에는 문서에 타입 정보를 적지 않아도 충분하다.

그러나 때로는 ts가 타입 정보를 추론하지 못하는 경우도 있다. 이러한 경우에는 문서에 타입 정보를 적어서 코드의 가독성을 높일 수 있다. 예를 들어, 다음과 같은 경우에는 타입 정보를 적어주는 것이 좋다.

/**
 * 문자열을 숫자로 변환합니다.
 * @param str 변환할 문자열입니다.
 * @returns 변환된 숫자입니다.
 */
function parseInt(str: string): number {
  // ...
}

이 함수는 string 타입의 매개변수를 받아서 number 타입의 결과를 반환한다. 이 경우에는 함수의 구현부에서는 명시적으로 타입을 지정하지 않았지만, 문서에 타입 정보를 적어줌으로써 코드의 가독성을 높일 수 있다.

따라서, 타입 정보를 적지 않아도 되는 경우에는 코드의 가독성을 높이기 위해 문서에 타입 정보를 적지 않는 것이 좋다. 그러나 타입 정보를 적어야 하는 경우에는 문서에 타입 정보를 적어서 코드의 가독성을 높일 수 있다.

0개의 댓글

관련 채용 정보