[하루 30분 러닝 타입스크립트] 유니언과 리터럴

✨유니언 타입

값에 허용된 타입을 두 개 이상의 가능한 타입으로 확장하는 것을 유니언이라 한다.

let mathmaticion = Math.random() > 0.5 ? undefined : "Mark Goldberg";
// mathmetician은 undefined와 string 타입을 가진다. 즉 유니언 타입을 가진다.

유니언 타입 선언

애너테이션으로 유니언 타입을 정의할 수 있다.

let thinker : string | null = null;

if(Math.random() > 0.5){
	thinker = "Susanne Langer";
}

유니언 속성

유니언 타입으로 설정한다면, 해당 모든 타입에 존재하는 속성만 사용할 수 있다.

let mathmaticion = Math.random() > 0.5 ? undefined : "Mark Goldberg";

mathmaticion.toString(); // OK

mathmaticion.toUpperCase(); // ERROR

mathmaticion.toFixed(); // ERROR

✨내로잉

값에 허용된 타입을 두 개 이상 가지지 못하게 하는 것, 구체적인 타입임을 코드에서 유추하는 것을 내로잉이라 한다.

타입을 좁히는 데 사용할 수 있는 논리적 검사를 타입 가드라고 한다.

타입 가드에는 다음과 같은 방법이 있다.

값 할당을 통한 내로잉

let admiral : number | string;

admiral = "Grace Hopper";

admiral.toUpperCase(); // OK
admiral.toFixed(); // ERROR
// 문자열 할당으로 string 타입으로 내로잉 되었다.

조건 검사를 통한 내로잉

let hello = Math.random() > 0.5 ? "STRING" : 51

if(typeof hello === "string"){
	hello // string 
}else {
	hello // number;
}
let hello = Math.random() > 0.5 && "STRING"

if(typeof hello === "string"){
	hello // string 
}else {
	hello // false;
}

참 검사를 통한 내로잉

let hello = Math.random() > 0.5 ? "STRING" : 51

if(hello === "STRING"){
	hello // string 
}else {
	hello // string | number;
}
let hello = Math.random() > 0.5 && "STRING"

if(hello){
	hello // string 
}else {
	hello // string | false;
}

논리 연산자 &&와 ?는 참 여부를 검사할 수 있지만, false일 경우 빈 문자열인지 undefined인지는 알 수 없습니다.

✨리터럴 타입

리터럴 타입은 구체적인 버전의 원시 타입을 의미한다.

const philosopher = "Hypatia"

philosopher // const philosopher: "Hypatia"
// Hypatia 라는 구체적인 리터럴 타입이 설정되었다.

✨엄격한 null 검사

‘십억 달러의 실수(The Billion-Dollar Mistake)’는 다른 타입이 필요한 위치에서 null 값을 허용하는 많은 타입 시스템을 가리키는 용어. 엄격한 null 검사가 없는 언어는 다음이 허용된다

const firstName: string = null;

strictNullChecks를 활성화 하여 모든 타입에 null과 undefined값으로 인한 안전 여부를 확인할 수 있다.

초기값이 없는 변수

let hello: string;

hello.length(); //ERROR Variable 'hello' is used before being assigned

값이 할당되기 전 해당 변수를 사용하려고 시도하면 위와 같은 오류가 나타난다.

✨타입 별칭

type RawData = boolean | number | null | string | undefined;

let rawDataFirst = RawData;

type을 이용하여 타입 별칭을 만들 수 있다.

타입 별칭 결합

타입 별칭을 다른 타입 별칭을 참조하여 만들 수 있다. 즉 유니언 타입인 타입 별칭 내 또 다른 유니언 타입인 타입 별칭을 사용할 수 있다.

type Id = number | string;

type IdMaybe = Id | undefined | null;