let 이름: string | number = 'kim';
let 나이: (string | number) = 100;
- "이 변수엔 string 또는 number가 들어올 수 있습니다~"라고 타입정의를 하고싶다면 | 연산자를 사용한다. OR 연산자와 비슷한데 이를 전문용어로 Union type이라고 한다.
- 괄호는 선택의 영역이며, 위 예시처럼 할당하는 순간 타입은 string또는 number 중 하나로 변한다.
var 어레이: (number | string)[] = [1,'2',3]
var 오브젝트: {data : (number | string) } = { data : '123' }}
- array와 object에서도 마찬가지로 사용할 수 있다.
let 이름: any = 'kim';
이름 = 123;
이름 = undefined;
이름 = [];
- any타입은 실드 해제 문법이기 때문에 갑자기 타입을 마구 바꿔도 에러가 나지 않는다.
- any 타입은 타입관련 버그가 생길시 왜 그런지 추적하기가 어렵기 때문에, 비상시에만 쓰는 변수 타입체크 해제 기능 정도로만 알아두자.
let 이름: unknown = 'kim';
이름 = 123;
이름 = undefined;
이름 = [];
- 요즘 타입스크립트는 any 대신 unknown 타입을 사용한다. any와 똑같이 모든 타입을 집어넣을 수 있다.
- 자료를 할당해도 타입이 자동으로 변하지 않고 unknown으로 남는다. unknown은 string, boolean 같은 별도의 타입 중 하나라고 생각하면 된다.
let 이름: unknown;
let var1: string = 이름;
let var2: boolean = 이름;
let var3: number = 이름;
let 이름: unknown;
이름[0];
이름 - 1;
이름.data;
- 이렇게 unknown 타입을 다른 곳에 집어넣으려고 하면 에러가 뜨는것도 별도의 타입이기 때문이다.(any는 가능)
- 아래와 같이 연산또한 불가능한데, 타입스크립트에서 덧셈은 number류의 타입만 할 수 있다.
- .data 같이 사용하는 것도 object류의 타입만 가능하다.
- 따라서 unknown은 아직 어떤 자료형을 정할 지 모르겠는데 약간의 안정성을 도모하고 싶을때 사용한다.
let 나이: string|number;
나이 + 1;
let 나이: unknown = 1;
나이 + 1;
- 두 문제 모두 에러를 출력하면서 계산이 안되는데, 그 이유는?
답 :
1) string|number는 string이나 number로 타입지정을 하는게 아니라 'string|number'자체가 하나의 union type이므로 계산이 안되는 것이다. 타입스크립트에선 number 자료형만 연산이 가능하다.(union type은 불가)
2) unknown또한 어느타입으로나 변할 수 있는 만능열쇠가 아니고 unknown이라는 하나의 타입이므로 연산이 안되는 것이다.
심화학습 :