5주차 Item 38 ~ 44
의도치 않은 타입 안전성의 손실을 피하기 위해서 any의 사용 범위를 최한으로 좁혀야 한다.
함수의 반환 타입이 any인 경우 타입 안정성이 나빠진다. 따라서 any 타입을 반환하면 절대 안된다.
강제로 타입 오류를 제거하려면 any 대신 @ts-ignore 사용하는 것이 좋다.
const config: Config = {
a: 1,
b: 2,
c: {
key: value
}
} as any
// 위 방식 보단 아래 방식으로..
const config: Config = {
a: 1,
b: 2,
c: {
key: value as any
}
}
any를 사용할 때는 정말로 모든 값이 허용되어야만 하는지 면밀히 검토해야한다.
any보다 더 정확하게 모델링할 수 있도록
any[]
{[id: string]: any}
() => any
처럼 구체적인 형태를 사용해야한다.
일반적인 타입들은 정제되기만 하는 반면, 암시적 any와 any[] 타입은 진화할 수 있다. 이러한 동작이 발생하는 코드를 인지하고 이해할 수 있어야 한다.
any를 진화시키는 방식보다 명시적 타입 구문을 사용하는 것이 안전한 타입을 유지하는 방법이다.
unknown은 any 대신 사용할 수 있는 안전한 타입이다 어떠한 값이 있지만 그 타입을 알지 못하는 경우라면 unknown을 사용하면 된다.
사용자가 타입 단언문이나 타입 체크를 사용하도록 강제하려면 unknown을 사용하면 된다.
몽키패치란?
일반적으로 런타임 중인 프로그램 메모리의 소스 내용을 직접 바꾸는 것
전역 변수나 DOM에 데이터를 저장하지 말고, 데이터를 분리하여 사용해야 한다.
내장 타입에 데이터를 저장해야 하는 경우, 안전한 타입 접근법 중 하나(보강이나 사용자 정의 인터페이스로 단언)를 사용해야 한다.
보강의 모듈 영역 문제를 이해해야 한다.
any type 추적
npx type-coverage
--detail 플래그를 붙이면, any 타입이 있는 곳을 모두 출력해 준다.
noImplicitAny가 설정되어 있어도, 명시적 any 또는 서드파티 타입 선언(@types)을 통해 any 타입은 코드 내에 여전히 존재할 수 있다는 점을 주의해야한다.
작성한 프로그램의 타입이 얼마나 잘 선언되었는지 추적해야 한다.
추적함으로써 any의 사용을 줄여 나갈 수 있고 타입 안전성을 꾸준히 높일 수 있다.