2024.10.27
any
의 사용 범위를 최소한으로 좁혀야 합니다.// 객체 전체를 any로 단언하여 부작용이 생길 수 있는 코드
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
대신 @ts-ignore
를 사용하는 것이 좋습니다.any
를 사용할 때는 정말로 모든 값이 허용되어야만 하는지 면밀히 검토해야 합니다.any
보다 더 정확하게 모델링할 수 있도록 any[]
또는 {[id: string]: any}
또는 () => any
처럼 구체적인 형태를 사용해야 합니다.c// 함수 내부에는 any가 꽤 많이 보이지만 타입 정의에는 any가 없기 때문에,
// cacheLast를 호출하는 쪽에서는 any가 사용됐는지 알지 못 함.
function cacheLast<T extends Function>(fn: T): T {
let lastArgs: any[] | null = null;
let lastResult: any;
return function (...args: any[]) {
if (ilastArgs || !shallowEq니al(lastArgs, args)) {
lastResult = fn(...args);
lastArgs = args;
}
return lastResult;
} as unknown as T;
}
any
와 any[]
타입은 진화할 수 있습니다. 이러한 동작이 발생하는 코드를 인지하고 이해할 수 있어야 합니다.// any 타입의 진화는 noImplicitAny가 설정된 상태에서 변수의 타입이 암시적 any인 경우에만 일어남.
let val = null; // 타입이 any
try {
somethingDangerous();
val = 12;
val // 타입이 number
} catch (e) {
console.warn('alas!1');
}
val // 타입이 number | null
any
를 진화시키는 방식보다 명시적 타입 구문을 사용하는 것이 안전한 타입을 유지하는 방법입니다.unknown은
any
대신 사용할 수 있는 안전한 타입입니다. 어떠한 값이 있지만 그 타입을 알지 못하는 경우라면 unknown
을 사용하면 됩니다.unknown
을 사용하면 됩니다.{}
, object
, unknown
의 차이점을 이해해야 합니다.{}
: null
과 undefined
를 제외한 모든 값을 포함object
: 모든 비기본형(non-primitive) 타입으로 이루어짐unknwon
: 어떤 타입이든 할당 가능// 타입 체커는 Document와 HTMLElement의 내장 속성에 대해서는 알고 있지만,
// 임의로 추가한 속성에 대해서는 알지 못함.
document.monkey = 'Tamarin1';
// ~~ 'Document' 유형에 'monkey' 속성이 없습니다.
// 이 오류를 해결하는 가장 간단한 방법은 any 단언문을 사용하는 것.
(document as any).monkey = 'Tamarin'; // 정상
declare global {
interface Document {
/** 몽키 패치의 속(genus) 또는 종(species) */
monkey: string;
}
}
document.monkey = 'Tamarin'; // 정상
interface MonkeyDocument extends Document {
/** 몽키 패치의 속(genus) 또는 종(species) */
monkey: string;
}
(document as MonkeyDocument).monkey = 'Macaque';
noImplicitAny
가 설정되어 있어도, 명시적 any
또는 서드파티 타입 선언(@types
)을 통해 any
타입은 코드 내에 여전히 존재할 수 있다는 점을 주의해야 합니다.any
의 사용을 줄여 나갈 수 있고 타입 안전성을 꾸준히 높일 수 있습니다.$ npx type-coverage // any의 개수 추적
9985 / 10117 98.69%