[ Typescript ] - 타입을 미리 정하기 애매할 때 ( union , any, unknown)

최문길·2023년 12월 20일
1

Typescript

목록 보기
4/23

그런데 변수에 들어올 타입이 string 일지 객체일지 배열일지 애매하고 예측 못하는 상황에서는 우짤까...?

방법이야 많지만 가장 많이 사용되는 몇 가지가 있다.

가장 좋은 union type - " | "

애매한 상황에서 string || number 둘 중 하나가 들어 올수 있다라고 타입 정의를 하면 되지 않을까??

이렇게 string 또는 number 요라고 타입을 정의 하고 싶으면

연산자 : | 기호를 사용하자

OR 연산자 같은 느낌이지 않은가???

아무튼 이렇게 타입이 2개 이상일때 : union type 이라고 부른다.

primitive type : Union Type

let 이름 : string | number = 'choi';
let age : (string | number) = 100;

이름과 age 변수에는 string | number만 들어올 수 있다.

그리고

할당하는 순간 타입은 string 또는 number 중 하나로 정해진다.

Array || Object : Union Type

var arr : number[] = [1,'2',3]
// 이렇게 바꾼다. 
var arr : ( number | string )[] = [1,'2',3]

// object

var obj = { data : number } = { data : '123' }
//이렇게 바꾼다. 
var obj = { data : number | string } = { data : '123' }

그런데 !!!

간혹

var arr : number | string [] = [1,'2',3] 

이렇게 하는 실수가 좀 잦았다 나는.. 저 위 타입지정을 한국말로 말하면

arr 이라는 변수는 number 또는 string만 담을 수 있는 배열이라는 뜻이다.

실수 하지 말고 ()안에 union type을 지정하자

any type

any라는 단어의 뜻에서 쉽게 유추 할 수 있듯이

아무 자료나 집어넣을 수 있는 타입이다.
전부를 집어 삼킬수 있는 막강한 녀석이랄까....

let 이름 : any = 'kim';
이름 = 123;
이름 = undefined;
이름 = [];

any 타입은 타입지정을 해제하는 문법이기에 any 좋아라고 하면서 마구쓰지 말자.
이유는
그러면 타입스크립트를 쓸 이유가 없기때문이니까..
그러므로 비상시에 변수 타입체크 해제기능 이런 용도로 사용하자

any와 유사한 unknown 타입

TypeScript 3.0에서 unknown 타입이 도입이 되었다.

unknown 타입은 단어의 뜻과 동일하게 '알 수 없다, 모른다'라는 의미를 가진다.

unknown 타입은 any 타입과 동일하게 모든 값(=type) 을 허용하지만, 할당된 값이 어떤 타입인지 모르기 때문에 함부로

프로퍼티나 연산을 할 수 없다.

let 이름: unknown = 'kim';
이름 = 123;
이름 = undefined;
이름 = [];

그리고 unknown 타입으로 선언된 변수는 any 이외에 다른 타입으로 선언된 변수에 할당 할 수 없다 .

let un: unknown = 'kim';

//  Error: Type 'unknown' is not assignable to type 'boolean'
let bool : boolean = un
//  Error: Type 'unknown' is not assignable to type 'boolean'
let unde : undefined = un
//  Error: Type 'unknown' is not assignable to type 'boolean'
let str : string = un
//  Error: Type 'unknown' is not assignable to type 'boolean'
let num : number = un
//  Error: Type 'unknown' is not assignable to type 'boolean'
let arr :  [] = un
//  Error: Type 'unknown' is not assignable to type 'boolean'
let obj : {} =un

unknown은 typescript의 Top type이다. 따라서 typescript에 있는 모든 타입을 포함하여 어느 값이든 가질 수 있다.

unknown을 사용하는 것은 컴파일러에게 ' 이 변수는 어떤 타입이될지 몰라 너가 추론해줘' 라고 이야기해주는 것과 같다.

하지만 이로인해 모든 타입이 공통적으로 할 수 있는 연산 외에는 할수 있는 것이 아무것도 없다.

따라서 unknown 타입 변수는 사용할 때 어떤 타입인지 다시 한번 명시를 해주어야 한다.

let un : unknown 
// 변수 타입은 unknown 이므로 어떤 타입의 값이든 할당가능
un = 'string'
// 재할당도 가능
un = [];

// 단, 다른 변수에 할당을 해주려면 타입을 명시해 줘야 한다 .
// un 변수의 타입이 명확하지 않으므로 [] 타입 변수에 값 할당이 불가능
let arr : [] = un

// unknown 타입 변수는 이렇게 사용할 때 타입을 명시해줘야함
let arr : [] = ( un as [] ) // as는 assertion문법임 

unknown 타입 변수에 대해 타입 검사가 된 후에는 타입을 위와 같이 명시하지 않아도 된다.

let num : unknown = 1
if(typeof num === 'number' ) {
  // if 조건문에서 엄격한 비교를 통해 데이터 타입이 number 값인지 확인했으므로
  // 새 number 타입에 변수 할당이 가능해짐
    let variable : number = num
}

unknown 타입으로 선언된 변수는 프로퍼티에 접근 할 수 없으며, 메소드를 호출할 수 없고 인스턴스를 생성할 수도 없다

let unClass : unknown;

unClass = [1,2,3,4]
// unClass is of type 'unknown'
unClass[0]

//그렇다면 타입이 unknown이고 배열 할당하면 될까??
let unClass : unknown = [1,2,3,4]
// unClass is of type 'unknown'
unClass[0] // 안된다...

결론

Any 타입 : 들어올 때도 내맘대로, 나갈 때도 내맘대로

unknown 타입 : 들어올 때는 내맘대로지만, 나갈땐 내맘대로 안된다.

0개의 댓글