02. (7) 타입스크립트에만 있는 타입

Hello World🙇🏻‍♀️·2023년 11월 29일

(1) any

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

any 타입을 쓰면 타입스크립트가 타입을 검사하지 못하므로 타입스크립트를 사용하는 의미가 퇴색됩니다. 게다가 any 타입을 통해 파생되는 결과물도 any 타입이 됩니다.

let str : any = 'hello';
const result = str.toFixed();		//const result : any

🌟 any로 추론하고 에러가 발생하는 경우

직접 any를 쓰지 않는다면 타입스크립트가 타입을 any로 추론할 때 종종 나타나는데, 대부분의 경우 any 로 추론되면 impliciAny 에러가 발생합니다.

//impliciAny 에러가 발생
function plus(x, y){
	return x + y;
}

🌟 any로 추론하고 에러가 발생하지 않는 경우

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를 반환하는 경우

타입스크립트가 명시적으로 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
});

(2) unknown

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);
}

(3) void

자바스크립트에서는 반환값이 없는 경우 undefined가 반환됩니다. 타입스크립트도 마찬가지이지만 타입은 void가 됩니다.

void의 경우 함수의 반환값을 무시하도록 하는 특수한 타입입니다,.

function noReturn(){}	//function noReturn : void
  1. 사용자가 함수의 반환값을 사용하지 못하도록 제한한다
  2. 반환값을 사용하지 않는 콜백 함수를 타이핑 할 때 사용한다

(4) {}, Object

{} 타입은 null 과 undefined를 제외한 모든 값을 의미합니다. 따라서 {} 타입은 Object 타입과 같습니다.

(5) never

never 타입에는 어떠한 타입도 대입할 수 없습니다.

  1. 무한 반복으로 인해 함수가 값을 반환하지 않을 때 never 반환
  2. 함수 표현식으로 throw를 반환했을 때 never 반환
//함수 선언문 : 반환값의 타입 void
function neverFunc1(){
	throw new Error('에러');
}

//함수 표현식 : 반환값 never
const result1 : never = neverFunc1();	// 에러 : void 값을 never에 대입할 수 없음
const neverFunc2 = () => {
	throw new Error('에러');
}


0개의 댓글