// 이건 안 좋음
const x: any = expression();
// 차라리 이렇게
// 이렇게 해야 다른 코드에 영향을 미치지 않는다.
const x = expression();
processBar(x as any);
함수의 반환 타입이 any인 경우 타입 안전성이 나빠진다. any타입을 반환하면 절대 안 됨
강제로 타입 오류 제거 시 any보다 @ts-ignore 사용하기
// 타입스크립트 업데이트로 인해 잘못된 오류가 발생하는 경우, 임시로 무시
// @ts-ignore
someLegacyFunction(); // 잘못된 오류로 인식된 상황
하지만 최소한으로 사용해야 한다.
any는 높은 확률로 구체적 타입으로 변경 가능함.
적어도 any보다는 any[]가 더 구체적임.
any를 사용할 때는 정말로 모든 값이 허용되어야 하는지 면밀히 검토하기
함수의 모든 부분을 안전한 타입으로 구현하는 것이 이상적이지만 불필요한 예외 상황까지 고려해 가며 타입 정보를 힘들게 구성할 필요는 없다.
함수 내부는 타입 단언을 사용하고 함수 외부로 드러나는 타입 정의를 정확히 명시하는 정도 하는 게 괜찮음.
프로젝트 전반에 타입 단언문이 드러나 있는 것보다 제대로 타입이 정의된 함수 안으로 타입 단언문을 감추는 게 더 좋은 설계
// 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("유효하지 않은 사용자 정보");
}
}
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 버전에 따라 다르게 작동하는 듯!
교재만 보면 안 되겠다. 실제 코드로 작성해봐야겠음.
never는 어떤 타입도 할당할 수 없는 타입이다.
unknown 상태로 사용하면 오류가 발생한다. 적절한 타입으로 변환하도록 강제하는 것.
개체에 속성을 추가하고 any 타입으로 단언하는 방식으로 쓰지 말기
해결1
interface 보강
inferface Document {
monkey: string;
}
document.monkey = 'Tamarin';
해결2
구체적인 타입 단언
interface MonkeyDocumnet extends Document {
monkey: string;
}
(document as MonkeyMocument).monkey = 'Macaque';
npm type-coverage
any타입 꾸준히 줄이기