반응형
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

짧은코딩

객체 래퍼 타입 지양하기 & 함수 표현식과 타입스크립트 본문

TS/이펙티브 타입스크립트

객체 래퍼 타입 지양하기 & 함수 표현식과 타입스크립트

5_hyun 2023. 2. 21. 11:46
반응형

객체 래퍼 타입

객체 래퍼 타입원시 타입의 값을 감싸는 형태의 객체이다. 예를 들어 string -> String, number -> Number 이런 식으로 사용한다. 기본 원시 타입들은 불변이며 메서드를 가지지 않는 점이 객체와 구분된다.

"apple".charAt(2);
// "p"

하지만 이 코드를 보면 기본 원시 타입도 메서드를 가진 것처럼 보인다. 사실 charAt는 string의 메서드가 아니고 자바스크립트 내부에서 string을 String으로 바꿔서 사용하기 때문에 charAt 같은 메서드를 사용할 수 있다. 즉, 기본형(원시 타입)과 객체 타입을 서로 자유롭게 변환 가능하다. 따라서 이 과정에서 string을 String 객체로 래핑(wrap)하고 이후 마지막으로 래핑한 객체를 버린다.

let x = "hello";
x.language = "English";
console.log(x.language); // undefined

위에서 말했듯이 마지막으로 래핑된 객체는 버려져서 위 코드의 출력값이 undefined가 나온다.

 

string은 String에 할당할 수 있지만 String은 string에 할당할 수 없다. 따라서 기본형(원시 타입)을 주로 사용하는 것이 좋은 방법이다.


함수 표현식

function rollDice1(sides: number): numbuer {/*...*/} // 문장
const rollDice2 = function(sides: number): number {/*...*/}; // 표현식
const rollDice3 = (sides: number): number => {/*...*/}; // 표현식

타입스크립트에서는 함수 표현식을 사용하는 것이 좋다. 그래야 재사용하기 좋다.

 

-재사용 간단한 예시

type DiceRollFn = (sides: number) => number;
const rollDice: DiceRollFn = sides => {/*...*/};

이렇게 코딩을 하고 rollDice의 sides에 마우스를 올려보면 number가 뜬다.

 

-재사용 복잡한 예시

// 재사용 안 한 코드
function add(a: number, b: number) {
  return a + b
}
function sub(a: number, b: number) {
  return a - b
}
function mul(a: number, b: number) {
  return a * b
}
function div(a: number, b: number) {
  return a / b
}

// 재사용 한 코드
type BinaryFn = (a: number, b: number) => number
const add: BinaryFn = (a, b) => a + b
const sub: BinaryFn = (a, b) => a - b
const mul: BinaryFn = (a, b) => a * b
const div: BinaryFn = (a, b) => a / b

이 코드에서만 봐도 함수 타입 선언으로 코드의 반복을 줄일 수 있다.

 

함수 매개변수에 타입 선언을 하는 것보다 함수 표현식 전체 타입을 정의하는 것이 코드의 안정성과 가독성을 높혀준다. 다른 함수의 시그니처와 동일 한 타입을 가지는 함수 작성, 동일한 타입을 가지는 여러 개의 함수를 작성할 때는 위처럼 타입을 반복하지 않고 타입 선언을 적용하면 좋다.

반응형

'TS > 이펙티브 타입스크립트' 카테고리의 다른 글

타입 반복 줄이기(필독)  (1) 2023.02.23
type과 interface  (0) 2023.02.21
타입 선언문과 단언문  (0) 2023.02.10
타입과 값 구분하기  (0) 2023.02.10
TS의 타입  (0) 2023.01.21
Comments