그런데 변수에 들어올 타입이 string 일지 객체일지 배열일지 애매하고 예측 못하는 상황에서는 우짤까...?
방법이야 많지만 가장 많이 사용되는 몇 가지가 있다.
애매한 상황에서 string || number
둘 중 하나가 들어 올수 있다라고 타입 정의를 하면 되지 않을까??
이렇게 string 또는 number 요라고 타입을 정의 하고 싶으면
연산자 : | 기호를 사용하자
OR
연산자 같은 느낌이지 않은가???
아무튼 이렇게 타입이 2개 이상일때 : union type 이라고 부른다.
let 이름 : string | number = 'choi';
let age : (string | number) = 100;
이름과 age 변수에는 string
| number
만 들어올 수 있다.
그리고
할당하는 순간 타입은 string 또는 number 중 하나로 정해진다.
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라는 단어의 뜻에서 쉽게 유추 할 수 있듯이
아무 자료나 집어넣을 수 있는 타입이다.
전부를 집어 삼킬수 있는 막강한 녀석이랄까....
let 이름 : any = 'kim';
이름 = 123;
이름 = undefined;
이름 = [];
any 타입은 타입지정을 해제하는 문법이기에 any 좋아라고 하면서 마구쓰지 말자.
이유는
그러면 타입스크립트를 쓸 이유가 없기때문이니까..
그러므로 비상시에 변수 타입체크 해제기능 이런 용도로 사용하자
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 타입 : 들어올 때는 내맘대로지만, 나갈땐 내맘대로 안된다.