프론트기술/Angular

Angular 를 위한 TypeScript TIP 5가지

RevFactory 2021. 10. 24. 08:46

TypeScript를 사용하는데 있어서 유용한 팁 5가지를 공유하고자 합니다.

이 내용은 ng-conf 2021 의 arron 의 영상 에서 발췌 했습니다.

 

1. 타입이 제공되지 않는 API 데이터에서 TypeScript 타입 추출하기

Angular에서 API를 통해 데이터를 가져올때 타입스크립트를 사용하는 우리는 타입을 모두 정의해줍니다. 특히 3rd party 에서 제공하는 API 를 정의해야 할때 번거로운 작업이 아닐 수 없습니다. 이때 사용가능한 유용한 사이트가 있습니다.

http://json2ts.com 여기서 json 데이터를 입력하면 TypeScript에서 사용한 타입 정의를 변환해줍니다.

 

2. Optional 값을 TypeScript 유형으로 정의하기

아래와 같은 타입 인터페이스가 정의되어 있을때, 이 값들을 모두 정의하지 않으면 에러가 납니다.

interface User { 
  name: string; 
  age: number; 
  gender: 'M' | 'F'; 
}

let user1: User = { name: 'robin', age: 38, gender: 'M' }; //OK 
let user2: User = { name: 'robin', age: 38 }; // 에러발생

물론 예제와 같은 경우, age에 ? 를 추가해서 nuallble 한 값으로 정의할 수도 있습니다.

interface User { 
  name: string; 
  age: number; 
  gender?: 'M' | 'F'; 
}

 

 

하지만 만약 상황에 따라서 옵션값이 될 수도 있고 필수값이 될 수 도 있다고 한다면, 해당 유형에 ? 를 붙이는 건 한계가 있습니다. 이에 TypeScript 에서는 몇가지 유틸리티성 제네릭 클래스를 제공합니다.

 

Partial 을 사용하게 되면, 해당 타입의 모든 필드를 Optional 하게 변경합니다.

type PartialUser = Partial<User>; 

const partialUser: PartialUser = { 
  name: 'robin' // optional 
};

 

 

Partial  뿐만 아니라 필드값을 전부 필수 필드로 만드는 Require 클래스와

특정 필드만 선택적으로 사용 가능할 수 있게 하는 Pick , 특정 필드만 제외하는 Exclude 클래스등이 제공됩니다.

여기서 자세한 사용법을 전부 다룰 순 없겠지만 이러한 클래스들을 이용하면 아래와 같은 코드 작성이 가능하게 됩니다.

type PickPerson2 = Pick<User, 'name' | 'age'> & Pick<Partial<User>, 'gender'>; 

const pickPerson2: PickPerson2 = { 
  name: 'robin', // required 
  age: 38, // required 
  gender: 'M' // optional 
};

 

 

3. Enum 타입 대신 Union 타입을 활용하기

TypeScript 에서 정의하는 enum 타입은 컴파일했을때 아래처럼 꽤 복잡한 형태로 변환이 됩니다.

enum GamePadInput { 
  Up = "UP", 
  Down = "DOWN", 
  Left = "LEFT", 
  Right = "RIGHT" 
}
var GamePadInput; 
(function (GamePadInput) { 
  GamePadInput["Up"] = "UP"; 
  GamePadInput["Down"] = "DOWN"; 
  GamePadInput["Left"] = "LEFT"; 
  GamePadInput["Right"] = "RIGHT"; 
})(GamePadInput || (GamePadInput = {}));

 

하지만 Union 타입을 사용하게 되면 더 짧고 간결해집니다.

export type GamePadInput = "UP" | "DOWN" | "LEFT" | "RIGHT";

 

그리고 이는 조합을 통해 더 파워풀한 결과를 내기도 합니다.

export type AuthAction = LoginSuccessfulAction | LoginErrorAction | LogoutSuccessfulAction

 

 

4. 쌍물음표 연산자로 코드를 단순화하기

기본값 설정을 위해 아래와 같은 코드가 있습니다.

if (value !== null && value !== undefined) {
  a = value; 
} else { 
  a = "default value"; 
}

 

위 코드는 물음표 두개를 이용하여 아래와 같이 코드를 간결하게 바꿀 수 있습니다 (TypeScript 3.7~)

a = value ?? 'default value';

 

기존 자바스크립트 구문으로는 아래처럼 사용을 했었습니다.

a = value || 'default value';

 

하지만 이 것은 0, NaN, 빈문자열에 대해서도 false 로 취급하여 default 값을 설정하는 문제가 있습니다.

만약 value 가 0이거나 "" 빈문자열인 경우, 의도하지 않게 'default value' 값이 a 에 할당되게 됩니다.

 

이러한 동작은 ?? 연산자에서 보완이 되었습니다.

console.log(0 ?? 10); // 0 
console.log("" ?? "default") // 빈문자열

 

 

 

5. Path Mapping 을 단순화하기

Angular 프로젝트 규모가 커지고 복잡해짐에 따라 import 구문을 보면 아래와 같이 path 가 너무 길어지는 이슈가 발생하게 됩니다.

import {something} from '../../../../../shared/shared.service'

 

이 경우, 아래처럼 path를 간결하게 바꿀 수 있는 방법이 있습니다.

import {something} from 'shared/shared.service'

 

타입스크립트 설정 파일 (tsconfig.conf) 에서 path mapping 구성을 할 수 있습니다.

@를 추가해서 구분하는 방법도 유용합니다.

"paths": { 
  "shared": [
    "shared" 
  ], 
  "shared/*": [
    "shared/*" 
  ], 
  "@model": [ 
    "src/app/model/index" 
  ]
}

 

이상 Typescript 5가지 팁에 대해서 알아보았습니다.

감사합니다.