이 글은 타입스크립트 환경에서의 개발을 가정하고 작성되었습니다.
any
•
never 제외한 모든 타입에 할당 가능
•
컴파일 시 타입 검사를 안 함
•
메서드 호출에 제한이 없음
let anyVar: any;
anyVar.toUpperCase(); // ✅. 가능
TypeScript
복사
•
장점 & 단점
장점
◦
개발자에게 편의성과 확장성 제공
단점
◦
런타임에서 예상치 못한 오류를 발생시킬 가능성을 높임
◦
◦
타입스크립트의 타입 검사를 무색하게 함 (타스는 실망했다)
any를 사용하는 건 사실상 자바스크립트와 동일한 방식으로 코드를 작성하는 것과 같다.
◦
값을 컨트롤하려면 많은 정보를 파악하고 관리해야 함
ex)
let anyVar: any = true;
const str: string = anyVar;
str.toUpperCase();
TypeScript
복사
위의 코드를 작성하더라도 타입스크립트는 오류를 발생시키지 않는다.
하지만 런타임에선 true.toUpperCase()와 같기에 에러가 발생한다.
str.toUpperCase(); // Uncaught TypeError: str.toUpperCase is not a function
TypeScript
복사
런타임
이와 같은 단점에도 불구하고 타입스크립트에서 하는 수 없이 사용해야 할 때가 있다. 대표적인 3가지 상황:
개발 단계에서 임시로 타입을 지정해야 할 때
어떤 값을 받아올지 또는 넘겨줄지 정할 수 없을 때
값을 예측할 수 없을 때
위와 같이 예외가 있음에도 any 타입 사용은 지양하는 게 좋다. 되도록 회피하자!
tsconfig.json 파일에서 noImplicitAny 옵션을 활성화하면 타입이 명시되지 않은 변수의 암묵적인 any 타입에 대한 경고를 발생시킬 수 있다.
"noImplicitAny": true
JSON
복사
unknown
•
any 타입 외에는 어떤 타입에도 할당할 수 없음
let unknownVar: unknown;
let booleanVar: boolean = unknownVar;
// Type 'unknown' is not assignable to type 'boolean'.
let boolVar: boolean = true;
let unknownVar: unknown = boolVar;
// 반대로 unknown 타입에 boolean 타입을 할당하는 건 가능
JavaScript
복사
•
컴파일러가 엄격하게 타입 검사 수행
•
메서드 호출 & 프로퍼티 접근 & 인스턴스 생성 불가 → 타입 좁히면 가능
let unknownVar: unknown;
unknownVar.toUpperCase();
// 'unknownVar' is of type 'unknown'.
JavaScript
복사
위 에러를 해결하기 위해선 unknown 타입을 string으로 좁혀줘야 한다.
const func = (val: unknown) => {
val.toUpperCase();
// 'val' is of type 'unknown'.
if (typeof val === "string") {
val.toUpperCase(); // ✅. string으로 타입을 좁혀준 뒤 메서드를 호출
}
};
JavaScript
복사
•
any보다 더 코드를 안전하게 작성 가능
•
any가 사용될 곳에 대체하여 사용 가능
•
타입스크립트 3.0 버전에 추가됨
공통점
자바스크립트에 존재하는 모든 타입의 값이 할당 될 수 있습니다.
차이점
any | unknown | |
never 제외한 모든 타입 | 할당 할 수 있는 타입 | any |
X | 컴파일 중 타입 검사 | O |
any, unknown, object, void, undefined, null, never 할당 호환성
타입 안정성 : 프로그램이 실행되기 전에 타입 관련 오류를 미리 찾아내고 타입 오류를 예방하는 것
출처
우아한 타입크립트 with 리액트