언노운 타입과 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타입도 어떠한 값이든 넣을 수 있다.
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타입은 에러가 발생한다.
function isString(target : unknown) : target is string{
return typeof target === 'string';
}
let testVal : unknown;
if(isString(testVal)){
testVal; //string
} // any보단 unknown을 쓰는게 낫다
any로 사용하지말고 차라리 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을 하게 되면 상대 타입으로 된다.
let number1 : unknown = 10;
let number2: unknown = 20;
// number1 + number2;
// number1-number2;
// number1*number2;
// number1 / number2;
number1 === number2;
number1!== number2;
연산자 중 비교연산자만 가능하다.
// (1) 함수에서 에러를 던질 때
function throwError() : never{
throw Error();
}
//(2) 무한루프
function infiniteLoop(): never{
while(true){
}
}
//(3) 존재할 수 없는 인터섹션
type StringAndNumber = string & number;
// let neverType: never = 10; //never는 일어날 수 없는 상황이기 떄문에 어떤 값이든 넣을 수 없다.
never타입은 함수가 정상적으로 끝이 나면 안된다.
또한 never는 일어날 수 없는 상황이기에 어떠한 값이든 넣을 수 없다.