unknown타입과 never타입

홍범선·2023년 10월 22일
0

타입스크립트

목록 보기
18/34

unknown타입이란?

언노운 타입과 any타입이 비슷하지만 any타입 비해 덜 관대하다

let anyValue : any;

anyValue = 24;
anyValue = '아이유';
anyValue = false;
anyValue = [];
anyValue = {};
anyValue = null;
anyValue = undefined;

any타입에는 어떠한 값이든 넣을 수 있다.

let unknownValue : unknown; // unknown도 any처럼 어떤 값이든 넣을 수 있다.

unknownValue = 24;
unknownValue = '아이유';
unknownValue = false;
unknownValue = [];
unknownValue = {};
unknownValue = null;
unknownValue = undefined;

unknown타입도 어떠한 값이든 넣을 수 있다.

unknown타입 다른 변수로 할당 안된다.

let anyType : any = anyValue; // anyType에 anyValue값을 넣을 수 있다.
let unknownType: unknown = anyValue;
let booleanType: boolean = anyValue;
let arrayType : string[] = anyValue;
let objectType : {} = anyValue;
let nullType: null = anyValue;
let undefinedType : undefined = anyValue;

let anyType : any = unknownValue; // unknown타입은 any나 unknown타입 변수에만 할당가능하다
let unknownType: unknown = unknownValue;
let booleanType: boolean = unknownValue;
let arrayType : string[] = unknownValue;
let objectType : {} = unknownValue;
let nullType: null = unknownValue;
let undefinedType : undefined = unknownValue;

any 타입으로 anyValue를 만들었었다.
이 anyValue값을 다른 변수에 할당하려고 할 때 어떠한 타입이든 가능하다.

하지만 unknown타입은 any타입, unknown타입을 가진 변수에만 할당이 가능하다.
나머지는 안된다.

anyValue.toUpperCase()
anyValue.name;
new anyValue(); 

// unknownValue.toUpperCase(); 
// unknownValue.name;
// new unknownValue()

any타입에는 모든 타입이 가능하기 때문에 에러가 나지 않는다.
반면에 unknown타입은 에러가 발생한다.

unknown타입 type predicate

function isString(target : unknown) : target is string{
  return typeof target === 'string';
}

let testVal : unknown;
if(isString(testVal)){
  testVal; //string
} // any보단 unknown을 쓰는게 낫다

any로 사용하지말고 차라리 unknown을 사용하자

unknown타입 유니온

type uOrString = unknown | string;//unknown
type uOrBoolean = unknown | boolean; //unknown
type uOrNumber = unknown | number; //unknown
type uOrNAny = unknown | any; //any
//unknown타입과 유니온을 하면 기본적으로 unknown값으로 되지만 any랑 할 경우 any가 된다.

/**
 * Intersection Type
 */
type uAndString = unknown & string; //string
type uAndBoolean = unknown & Boolean; //boolean
type uAndNumber = unknown & Number; //number
type uAndAny = unknown & any //any
//unknown타입과 intersection을 하게 되면 상대 타입으로 된다.

unknown 오퍼레이터

let number1 : unknown = 10;
let number2: unknown = 20;
// number1 + number2;
// number1-number2;
// number1*number2;
// number1 / number2;

number1 === number2;
number1!== number2;

연산자 중 비교연산자만 가능하다.

never타입

// (1) 함수에서 에러를 던질 때
function throwError() : never{
  throw Error();
}

//(2) 무한루프
function infiniteLoop(): never{
  while(true){

  }
}

//(3) 존재할 수 없는 인터섹션
type StringAndNumber = string & number;

// let neverType: never = 10; //never는 일어날 수 없는 상황이기 떄문에 어떤 값이든 넣을 수 없다.

never타입은 함수가 정상적으로 끝이 나면 안된다.
또한 never는 일어날 수 없는 상황이기에 어떠한 값이든 넣을 수 없다.

profile
알고리즘 정리 블로그입니다.

0개의 댓글