any타입은 모든타입을 사용할 수 있습니다. 그렇기에 종종 알 수 없는 타입에러가 발생할 때 any를 사용하여 해결 할 수 있습니다. 하지만 any 타입은 지양하는 것이 좋습니다.

any 타입을 쓰면 타입스크립트가 타입을 검사하지 못하므로 타입스크립트를 사용하는 의미가 퇴색됩니다. 게다가 any 타입을 통해 파생되는 결과물도 any 타입이 됩니다.
let str : any = 'hello';
const result = str.toFixed(); //const result : any
직접 any를 쓰지 않는다면 타입스크립트가 타입을 any로 추론할 때 종종 나타나는데, 대부분의 경우 any 로 추론되면 impliciAny 에러가 발생합니다.
//impliciAny 에러가 발생
function plus(x, y){
return x + y;
}
any 여도 에러가 발생하지 않을 때가 있는데, 빈 배열을 선언하고 타입을 명시하지 않으면 해당 배열이 any[] 타입이 됩니다.
const arr = []; //const arr : any[]
const arr1 : string [] = [];
//any[] : 인덱스 요소를 추가할 때마다 추론하는 타입이 변환
const arr2 = []
arr2.push(1); //const arr2 : number[]
arr2.push('1'); //const arr2 : (string|number)[]
타입스크립트가 명시적으로 any를 반환하는 경우 대표적으로 JSON.parse와 fetch함수가 있습니다!
fech('url').then((response)=>{
return response.json();
}).then((result)=>{ //result : any
});
//직접 타이핑하여(제네릭 사용) 향후 모든 타입이 any가 되는 것을 방지해야합니다.
fech('url').then<{ data : string }>((response)=>{
return response.json();
}).then((result)=>{ //result : any
});
unknown은 any와 비슷하게 모든 타입을 대입할 수 있지만 그 후 어떠한 동작도 수행할 수 없게 됩니다.

unknown 인 a와 b 변수를 사용한 모든 동작이 에러로 처리됩니다. unknown은 타입을 직접 표시할 경우는 거의 없고, 대부분 try catch 구문에서 보게 됩니다.
try{
}catch(e){ //var e : unknown
console.log(e.message); // e is of typeof unknown
}
위 코드처럼 입력하면 err가 발생하기 때문에 아래처럼 타입을 강제 지정하는 것이 좋습니다.
//as 로 타입주장하기
try{
}catch(e){
const err = e as Error;
console.log(err);
}
//<> 사용하기 : 💥 리액트의 JSX와 충돌하므로 as를 사용하는 것이 더 좋습니다.
try{
}catch(e){
const err = <Error>e;
console.log(err);
}
자바스크립트에서는 반환값이 없는 경우 undefined가 반환됩니다. 타입스크립트도 마찬가지이지만 타입은 void가 됩니다.
void의 경우 함수의 반환값을 무시하도록 하는 특수한 타입입니다,.
function noReturn(){} //function noReturn : void
{} 타입은 null 과 undefined를 제외한 모든 값을 의미합니다. 따라서 {} 타입은 Object 타입과 같습니다.
never 타입에는 어떠한 타입도 대입할 수 없습니다.
//함수 선언문 : 반환값의 타입 void
function neverFunc1(){
throw new Error('에러');
}
//함수 표현식 : 반환값 never
const result1 : never = neverFunc1(); // 에러 : void 값을 never에 대입할 수 없음
const neverFunc2 = () => {
throw new Error('에러');
}