이번 장은..
자바스크립트의 프로젝트를 꾸준하게 타입스크립트로 마이그레이션하는 방법을 배운다.
import , export
를 사용하는 ECMAScript 모듈(ES모듈)이 표준이다.함수를 ES2015 클래스로 변환
사용var
키워드의 스코프 규칙은 let, const
처럼 제대로 된 스코프 규칙이 아니여서, 일반적으로 기대하는 방식으로 동작하지 않는다.var
대신 let/const
를 사용하자.for-of
는 코드가 짧고 인덱스 변수를 사용하지 않기 때문에 실수를 줄일 수 있다.forEach
메서드 사용for-in
은 몇 가지 문제가 있기 때문에 사용하지 말자 (타입이 안정하지 않음)// for(;;)
for (var i = 0; i < array.length; i++) {
const el = array[i]
// ...
}
// for of
for (const el of array) {
// ...
}
// forEach
array.forEach((el, i) => {
// ...
})
noImplicitThis
또는 strict
를 설정하면, this 바인딩 관련된 오류를 표시해준다.const x = 1,
y = 2,
z = 3
const pt = {
x: x,
y: y,
z: z,
}
// 단축 객체 표현
const pt = { x, y, z }
const props = obj.props
const a = props.a
const b = props.b
// 구조 분해 할당
const { props } = obj
const { a, b } = props
base
가 선택적 매개변수라는 것을 명확히 나타내는 효과도 줌.function parseNum(str, base = 10) {
return parseInt(str, base)
}
asnyc/await
를 사용하면 코드가 간결해져서 버그나 실수를 방지할 수 있고, 비동기 코드에 타입 정보가 전달되어 타입 추론을 가능하게 함.function getJSON(url: string) {
return fetch(url).then(response => response.json())
}
function getJSONCallback(url: string, cb: (result: unknown) => void) {
// ...
}
// async/await 사용
async function getJSON(url: string) {
const response = await fetch(url)
return response.json()
}
constructor
)strict mode
보다 TS에서 수행되는 안전성 검사가 더 엄격해서 TS의 코드에서 use strict
는 무의미하다.alwaysStrict
설정을 사용해야 한다.🎯 요약
타입스크립트 개발 환경은 모던 자바스크립트도 실행할 수 있으므로 최신 기능을 활용하자.
@ts-check
// @ts-check
const person = {first: 'Grace', last: 'Hopper'};
2*person.first
// ~~~~~~~~~~~~ 산술 연산자 오른쪽은 'any', 'number', 'bigint'
// 또는 열거형 형식이어야 합니다.
types.d.ts
파일을 이용하여 변수 인식시키거나 **트리플 슬래시**
로 명시적인 임포트JSDoc
을 통한 타입 단언 대체🎯 요약
마이그레이션의 궁극적인 목표는 모든 코드를 TS 기반으로 전환되는 것이므로 JSDoc
과 @ts-check
같은 중간단계를 너무 공들일 필요는 없다.
allowJs
컴파일러 옵션은 TS와 JS가 공존하게 해준다.
- 번들러, 플러그인 방식으로 통합되어 있다면 간단히 적용가능
npm install —save-dev tsify
- 프레임워크 없이 빌드 체인 직접 구성한 경우
outDir
옵션을 사용한다.
🎯 요약
TS로 대규모 마이그레이션 함과 동시에 빌드와 테스트가 동작하게 하는 것이 힘들지만 제대로 마이그레이션을 하기 위해서는 반드시 필요하다.
madge
라는 도구를 이용하면 의존성 관계를 시각화 할 수 있다.)js와 달리 ts 클래스에선 클래스 멤버 변수를 선언해주어야하는데 빠른 수정 기능을 이용해서 추가하며, 정확하게 추론되지 않은 타입들을 수정해주어야한다.
당장의 마이그레이션이 중요하면 타입 단언문을 사용하고 이후 문제를 제대로 해결해야 한다. 또는 JSDoc과 같은 타입 정보를 추가한 상태이면 이를 이용한 빠른 수정이 가능하다.
최종적으로 테스트 코드는 의존성 관계도의 최상단에 위치하기 때문에 마이그레이션의 마지막 단계로 수정하면 된다.
🎯 요약
마이그레이션을 점진적으로 모듈 단위로 해결하고, 리팩토링은 추후의 문제이다.
.ts
로 전환했다면, noImplicitAny
를 설정해야 한다.noImplicitAny
로컬에만 설정하고 작업하는 것이 좋다."strict": true
이다.🎯 요약
프로젝트 전체를 .ts
로 전환했다면, 점진적으로 noImplicitAny
를 설정하자.