만약 변수에 들어올 값이 string인지 number인지 모를 때 어쩔지 알아보자.
방법이 몇가지가 있는데
이변수에는 string이나 number가 들어갈 수 있다는 의미인 타입 정의를 할때는 |
연산자를 사용한다.
이친구를 Union Type이라고 합니다.
let name: string | number = 'kim';
let age: (string | number) = 100;
할당하는 순간 타입은 string이나 number만 들어갈 수 있다.
let array: (string | number)[] = [1, '2']
이렇게 씀 ㅇㅇ
let object: {data : (number | string)} = { data : '123 }
이렇게 씀 ㅇㅇ
아무 자료나 넣을 수 있는 타입이다.
let name: any = kim;
name = 123;
name = undefined;
name = [];
any타입은 갑자기 타입을 막 바꿔도 에러가 안난다.
이거 마구잡이로 쓰면 타입스크립트 장점 없어지니까 비상시에만
let name: unknown = 'kim';
name = 123;
name = undefined;
name = [];
요즘엔 이거 많이 쓰는데
any랑 비슷함
모든 타입을 넣을 수 있고, 자료를 집어 넣어도 타입은 그대로 unknown이다.
let 이름: unknown;
let 변수1: string = 이름;
let 변수2: boolean = 이름;
let 변수3: number = 이름;
// 이거 다 에러
unknown 타입을 다른데 집어넣을 때는 에러가 난다.
any는 안그런다.
ts는 정확하고 확실해야한다.
확실하지 않은 타입에 연산하지 못한다.
ts에서 뺄셈은 number류만 할 수 있고, unknown에서도 안된다.
.name이런건 object류의 타입만 할 수 있다.
즉, 아직 집어넣을 게 뭔지 모르겠고 안정성을 원하면 unknown
을 쓰자
unknown 타입인 변수를 조작할 때
조작할 변수의 타입이 뭔지 확실 히 체크하는narrowing
이나assertion
을 사용해야 한다.
변수에 뭐가 들어있을지 애매하면 반드시 사용하자.