TypeScript 2.0 RC 기준 strictNullChecks 켜고 기존 프로젝트 뜯어 고치는 중. 기대 이상으로 많이 잡힌다.
플래그 하나 켜면 null과 undefined가 별도 타입이 되고, 모든 레퍼런스 타입에서 자동으로 nullable하지 않게 됨. 이걸 원할때만 T | null 명시.
// strictNullChecks OFF
function getUser(id: number): User {
return users.find(u => u.id === id);
}
// ↑ find()는 undefined 반환할 수 있는데 타입체커가 봐주고 있었음
// strictNullChecks ON
function getUser(id: number): User | undefined {
return users.find(u => u.id === id);
}
// 호출부에서도 undefined 처리 강제
기존 JS에서 은근 많이 쓰던 패턴이 다 경고로 뜸.
obj.foo.bar— obj가 null이면 런타임 에러. 타입체커가 이제 잡음- API 응답 매핑 후 optional 필드 접근 — 인터페이스에
?안 붙으면 non-null로 간주되던게 바뀜 arr.find(...)반환값을 바로 프로퍼티 접근
Non-null assertion 연산자 ! 도 이번에 도입. "타입스크립트야 나는 확신한다" 라고 말해주는 용도.
const el = document.getElementById('root')!; // HTMLElement (not HTMLElement | null)
남발하면 strict의 의미가 없어지지만 DOM API처럼 런타임에 확실히 있는걸 아는 경우엔 유용함.
우리 프로젝트는 파일 200개쯤 되는데 플래그 켜니까 경고 400개 나옴. 지금 절반 잡았음. 남는건 optional prop 매핑 쪽 싱클 대응이 대부분. 이거 하고 나면 런타임 "Cannot read property 'x' of undefined" 같은 에러가 확 줄어들 거 같다.
2.0 정식은 9월 예정. 꼭 써봐야 할 플래그.