javaScript/typeScript

union type

부엉이사장 2024. 8. 14. 13:25

# union type이란?

타입을 여러개 지정할 수 있는 방법이다.

let test: string | number = "jacob";
test = 1;

test라는 변수는 string타입 혹은 number타입이다.

처음에 jacob이라는 스트링을 할당했다가 숫자 1을 재할당하면 두 타입 되니까 오류 안뜬다.

저렇게 or기호로 타입을 or로 써줄 수 있음. and는 당연히 없음.

 

 

# 어레이에 union type지정하기

let arr: string[] = ["a", "b", "c"];

이렇게 스트링만 들어갈 수 있는 어레이에다가 숫자도 들어갈 수 있게 하려면,

let arr: string[] = ["a", "b", "c", 1];

에러가 뜬다.

이때 union type을 사용해보자.

 

let arr: number | string[] = ["a", "b", "c", 1];

어라? 에러가 뜬다.

이유는 이게 해석이 arr라는 식별자에는 숫자 타입 or 문자만 들어간 어레이 라는 뜻이 되기 때문이다.

let arr: number | string[] = ["a", "b", "c"];

arr = 1;

재해석한 내용으로 코드를 고쳐보면 위에 적은 두 타입 모두 에러없이 실행되는걸 볼 수 있다.

우리가 원하는 대로 타입지정을 하려면,

let arr: (number | string)[] = ["a", "b", "c", 1];

이렇게 number와 string을 소괄호로 감싸주면 된다.

네 에러안뜨네용..

 

 

 

# any type

let test: any = 1;
test = "jacob";
test = true;

모든 값들어가는게 any type임

 

 

# unknown타입

let test: unknown = 1;
test = "jacob";
test = true;

any랑 비슷함.

 

 

# 차이점은?

let test: any = 1;
test = "jacob";
test = true;
console.log(test.toFixed(2));

에러가 안뜬다.

let test: unknown = 1;
test = "jacob";
test = true;
console.log(test.toFixed(2));

오류가 뜬다.

 

ts만의 차이인것 같은데 만약 js에서 저 두 코드를 사용하려고 헀다면, 둘다 에러를 띄웠을 것이다.

차이점은 any타입은 타입검사를 아예 해제시켜버리고, unknown은 타입검사를 한다는 것이다.

때문에 해당 변수를 사용하려고할때 문제가 있다면 저렇게 ts상에서 에러를 띄워준다는 것 같음.

실제 사용해봐야 정확히 알 수 있을 것 같다.

 

# 간단한 예시 2

let test1: any = "바보";
test1 - 1;

let test2: unknown = "바보";
test2 - 1;

test1과 test2둘다 에러가 떠야하는데 any 타입에선 안뜨고 unknown타입인 test2에서만 에러가 뜬다.

 

 

 

# union type주의점

let test: number | string = 2;
test - 1;

얘는 에러가 안뜬다. 응 왜?

let test: unknown = 2;
test - 1;

얘는 에러가 뜬다.

 

논리회로가 이해는 안되지만.. 뭐 narrowing assertion배우면 해결된다고 함.

 

 

 

 # 좀 이해안되는점

let test: number | string = 2;
test - 1;
test = "바보";
test - 1;

처음에 union type으로 두가지 된다고하고 2를 할당함.

근데 두번째줄 test -1 에서는 에러가 안뜨고

네번째줄 test-1에서는 에러가 뜸.

계속 타입이 바뀌나?

let test: number | string;
test = 2; 
test - 1;// 에러안뜸
test = "바보";
test - 1;// 에러뜸

선언 할당을 쪼개도 똑같다.

 

let test: number | string;
test - 1;

이건 에러 뜨는데 처음 union type으로 number string둘다 뜸

let test: number;
test - 1;

이렇게 하면 또 에러안뜸.

 

선언할당시 타입지정하면 그냥 기본값은 없다고 생각해야 되는듯? js 깊게공부할때 초기화랑 복합적으로 생각하니 헷갈리는듯.

 

let test: unknown = 2;
test - 1;

이건 에러뜸..

 

걍 선언 할당 분리해서 써야하나..?

unknown타입은 타입을 확실히 하고 연산을 한다고 한다. 뭐 narrowing assertion이 그거라고 하네.. 배워야 알듯

 

 

# 숙제

let 학교: {
  score: (number | boolean)[];
  teacher: string;
  friend: string | string[];
} = {
  score: [100, 97, 84],
  teacher: "Phil",
  friend: "John",
};
학교.score[4] = false;
학교.friend = ["Lee", 학교.teacher];

score라는 키에는 숫자 혹은 불린이 들어가는 어레이. 밑에  학교.score[4]에 false를 넣었기 때문

teacher는 그냥 스트링이고.

friend에는 그냥 스트링이나 스트링만 들어가는 어레이. 밑에 학교.friend = ["Lee", 학교.teacher] 이거 때문.

'javaScript > typeScript' 카테고리의 다른 글

function  (0) 2024.08.14
primitive types  (0) 2024.08.14
installation & setting  (0) 2024.08.14
ts // 컴파일, static typing, 인터페이스, 선택적 프로퍼티, readonly  (0) 2022.12.19