타입스크립트는 값을 바탕으로 타입을 추론한다.
타입 추론의 두 가지 핵심 개념 (타입스크립트에서만 존재)
let mathematician: string | undefined = Math.random() > 0.5 ? undefined : "Mark Goldberg";
|
를 사용해서 유니언 타입임을 나타낸다.string | undefined
나 undefined | string
이나 같다.let physicist = Math.random() > 0.5 ? "Marie Curie" : 84;
physicist.toString(); // 사용 가능 -> toString는 string, number 모두 사용가능한 메서드이다.
physicist.toUpperCase(); // ❌ toUpperCase는 string에서만 사용 가능해서 안된다.
physicist.toFixed(); // ❌ toFixed는 number에서만 사용 가능해서 안된다.
let admiral: number | string;
admiral = "Harry Potter"; // 이 시점에 admiral의 타입이 string으로 내로잉된다.
admiral.toUpperCase(); // 사용 가능
admiral.toFixed(); // ❌ admiral의 타입이 string으로 내로잉되었으므로 number 타입의 속성인 toFixed는 사용 불가하다.
if 문
을 통해서 변수의 타입을 좁히는 방법let friend = Math.random() > 0.5 ? "Harry Potter" : 22;
if (friend === "Harry Potter") {
friend.toUpperCase(); // friend가 string 이기 때문에 사용 가능
}
friend.toUpperCase(); // ❌ toUpperCase는 number 타입에 적용되지 않는 메서드이므로 에러
typeof
검사를 통한 내로잉if 문
과 함께 typeof
연산자를 사용해서 동일 타입인지 확인하는 방법으로 타입을 좁힌다.let student = Math.random() > 0.5 ? "Harry Potter" : 32; // student의 타입은 string 이거나 number 이다.
if (typeof student === "string") {
student.toUpperCase(); // student가 string 타입이므로 toUpperCase 메서드 사용 가능
} else {
student.toFixed(); // student가 number 타입이므로 toFixed 메서드 사용 가능
}
const
로 선언한 변수에 할당된 리터럴 값이 리터럴 타입이 된다.const friend = "Harry";
string
타입이기도 하지만, 구체적인 타입은 “Harry”
이다.let friend: "Harry" | "Ron" | number;
friend = "Harry"; // 사용 가능
friend = "Ron"; // 사용 가능
friend = 233; // 사용 가능
friend = true; // ❌ 에러
friend = "Voldemort"; // ❌ 에러
tsconfig.json
에서 strictNullChecks: true
로 설정하는 것이 타입스크립트의 권장사항이다.null
또는 undefined
값으로 인한 에러(aka 십억 달러의 실수)로부터 안전하게 할 수 있다.type 내가 짓는 타입 이름 = 타입
type RawData = boolean | number | string | null | undefined;
let firstData: RawData;
let secondData: RawData;