5장 any 다루기

ClassBinu·2024년 4월 28일

38 any는 가능한 좁은 범위에서만

// 이건 안 좋음
const x: any = expression();

// 차라리 이렇게
// 이렇게 해야 다른 코드에 영향을 미치지 않는다.
const x = expression();
processBar(x as any);

함수의 반환 타입이 any인 경우 타입 안전성이 나빠진다. any타입을 반환하면 절대 안 됨
강제로 타입 오류 제거 시 any보다 @ts-ignore 사용하기

@ts-ignore

// 타입스크립트 업데이트로 인해 잘못된 오류가 발생하는 경우, 임시로 무시
// @ts-ignore
someLegacyFunction();  // 잘못된 오류로 인식된 상황

하지만 최소한으로 사용해야 한다.

39 any를 구체적으로 변형하기

any는 높은 확률로 구체적 타입으로 변경 가능함.
적어도 any보다는 any[]가 더 구체적임.

any를 사용할 때는 정말로 모든 값이 허용되어야 하는지 면밀히 검토하기

40 함수 안으로 타입 단언문 감추기

함수의 모든 부분을 안전한 타입으로 구현하는 것이 이상적이지만 불필요한 예외 상황까지 고려해 가며 타입 정보를 힘들게 구성할 필요는 없다.

함수 내부는 타입 단언을 사용하고 함수 외부로 드러나는 타입 정의를 정확히 명시하는 정도 하는 게 괜찮음.
프로젝트 전반에 타입 단언문이 드러나 있는 것보다 제대로 타입이 정의된 함수 안으로 타입 단언문을 감추는 게 더 좋은 설계

// API 응답을 변환하는 함수 예시
function processApiResponse(response: any): User {
    // 여기서는 API 응답 형식을 알고 있으므로 타입 단언 사용
    const user = response as User;
    validateUser(user); // 유효성 검사를 수행
    return user;
}

interface User {
    name: string;
    email: string;
}

// 유효성 검사 함수
function validateUser(user: User) {
    if (!user.name || !user.email) {
        throw new Error("유효하지 않은 사용자 정보");
    }
}

41 any 진화 이해하기

any는 진화한다.

function range(start: number, limit: number) {
  const out = []; // []는 any타입이다.(아마 과거 버전에서)
  for (let i = start; i < limit; i++) {
    out.push(i);
  }
  return out; // 반환 타입이 number[]로 추론된다.
}

근데 실제 코드 작성해 보니까 out이 any가 아닌 never[] 추론됨.
ts 버전에 따라 다르게 작동하는 듯!
교재만 보면 안 되겠다. 실제 코드로 작성해봐야겠음.

42 모르는 타입은 any 대신 unknown

never는 어떤 타입도 할당할 수 없는 타입이다.
unknown 상태로 사용하면 오류가 발생한다. 적절한 타입으로 변환하도록 강제하는 것.

43 몽키 패치보다 안전한 타입 사용

개체에 속성을 추가하고 any 타입으로 단언하는 방식으로 쓰지 말기

해결1
interface 보강

inferface Document {
  monkey: string;
}

document.monkey = 'Tamarin';

해결2
구체적인 타입 단언

interface MonkeyDocumnet extends Document {
  monkey: string;
}
(document as MonkeyMocument).monkey = 'Macaque';

44 타입 커버리지 추적

npm type-coverage

any타입 꾸준히 줄이기

0개의 댓글