TypeScript Korea Meetup
TypeScript로부터 얻은 것과 잃은 것 - 손찬욱님(NAVER)
1. TypeScript를 사용한 이유
egjs 2.x
작업을 해야했고 컴포넌트들 중에eg.MovableCoord
라는 컴포넌트가 있었는데 이것을 개선하고자 하면서TypeScript
를 검토하게 되었다.- 줌, 마우스휠, 키보드로도 좌표를 표현하고 싶었고 다형성 및 사용자가 지정하고자 하는 다중의 축들을 제어하기 위해 안정적으로 개발할 수 있는 방법을 찾다가
TypeScript
로 결정했다. - 기존의
x
,y
축을N
개의 축을 제어하고 싶었다. - 기존과 인터페이스 자체가 달라져서 다시 만들어야 하는 김에
MovableCord
를Axex
로 바꿔야겠다고 생각. - 안정적으로 개발하는 방법을 찾다가
TypeScript
를 생각했다. - 다양한 입력 타입은
TypeScript
의inputType
인터페이스를 적용하고 각각의 인터페이스들을 기능별로 구현했다. Axes
와는 루즈하게 연결할 수 있게 만들었다.- 그 결과, 입력 타입도 다양하게 쓸 수 있게 되었고, 축도 늘었다.
2. TypeScript로 얻은것
1. 코드 의도가 분명해짐
interface
로 설계 의도가 코드에 명확히 보이는데 기존의JavaScript
는 이런 부분이 좀 부족했다.TypeScript
는definition
파일까지 자동으로 만들어줬다.
2. 안정성
- 구현 안 된 요소들이 있을 경우에는 에러로 명확하게 표시해주고, 툴을 쓰면 구현체 형태까지 만들어준다.
- 편의성과 안정성을 높여준다.
- 잘못된 값을 넣거나 필수값을 안넣으면 에러를 띄워준다.
- 자바스크립트에서는 누락될 수 있는 부분들을 잡아주는데 이게 단순하면서도 의외로 오류가 많이 생기는 부분이다.
3. 편의성
Code Assist
제공된다.- 코드이동이 가능하다.
- 사용자 정보를 좌표로 변환해야 하는 경우가 많은데 (
data
를 변경하는 작업) 데이터가 요건에 따라서operator
를 통해서 변형하게 된다. - 데이터 타입이 있어서 코드 어시스트 효과도 볼 수 있고 없는
property
에 접근하게 되면 에러를 띄워준다.
4. 데이터 흐름 추적 (안정성)
- 데이터를 전달하거나 변형하는 경우에
TypeScript
가 좋다
5. 결과 코드의 폭넓은 지원 범위
TypeScript
는 공식적으로ES3
를 지원해준다. 코드 한 줄만 넣으면 된다.- 반면,
Babel
은 공식적으로ES3
를 지원하지 않는다.babel
에서ES3
를 지원하기 위해서는 많은 작업을 해야 한다.
3. TypeScript로 잃은것
1. 외부 모듈 사용의 불편함
3’rd party 라이브러리 사용시 Axes
는 Hommerjs
를 사용한다.1
import Hammer from 'hammer.js';
위와 같이 import
를 시켜줬지만 Hammer
를 가져올 수가 없다. TypeScript
에서는 undefined
가 뜨고, Babel
에서는 Hammer
가 뜬다.
하지만 아래와 같이 입력해주면 TypeScript
에서도 Hammer
, Babel
에서도 Hammer
가 뜬다.1
import * as Hammer from 'hammer.js'
왜 이런 상황이 발생하는가?
Hammerjs
는 UMD
형태로 지원한다. 하지만 ES6 Module
로 호출시 CommonJS
형태로 인식한다. 그래서 원래는 undefined
로 뜨는게 맞는 것이다.
그럼
babel
에서는 왜hammer
가 잘 떴을까?
babel
같은 경우에는 transform-es2015-modules-commonjs
를 기본 preset에서 제공하기 때문이다. 다행인 것은 요즘 모듈들은 UMD
뿐만 아니라 ES6 Module
용도 함께 배포한다는 것이다.
2. 외부 type definition 파일이 완벽하지는 않다.
3’rd party 라이브러리 @types
사용시 CssProps
내부 속성이 다 필수여서 재정의하거나 다시 만들어야 하는 번거로움이 있다.
3. 과한 사용은 오히려 독!
과한 사용을 하면 가독성이 떨어진다.
4. 정리
1. 좋은 점 (얻은 것)
- 코드가 명확해지고 별도 주석을 안달아도 명세화가 가능하다
- 안전성. 구현의 실수를 개발 중 잡아준다. 특히, 데이터 전달과 변환이 많은 곳에서 굉장히 좋다.
- 편의성. 툴 사용의 극대화
ES3
까지 손쉽게 지원
2. 나쁜 점 (잃은 것)
- 외부 모듈 사용이 불편하다.
UMD
나CommonJS
형태의 기존 모듈 사용시 번거롭다- 외부
type definition
파일이 완벽하지는 않다. - 과하게 쓰면 오히려 가독성을 떨어뜨린다. (generic)