타입 추론 (Type Inference)
- 타입스크립트에서 자체적으로 변수나 파라미터의 타입을 유추하는 기능
기본 타입 추론 예시
- 아래의 코드에서는
:number
와 같이 타입을 지정해주지 않았음에도 타입스크립트가 스스로 타입을 추론함
let myNumber = 1000; // number 타입
let myBoolean = true; // boolean 타입
let myString = "jake"; // string 타입
myNumber = "JAKE"; // 기존에 number 로 추론된 타입에 문자열을 넣으려 하면 에러가 발생함
const 키워드가 붙었을 때의 타입 추론
const
키워드가 붙으면let
키워드와 좀 다르게 상수로 타입을 추론함const
로 선언된 상수는 변화할 일이 없으니 더 구체적인 타입이 추론됨
const stringLiteral: "string literal" = "string literal"; // "string literal" 문자열 자체가 타입 이름이 됨
const constBoolean: true = true; // true 자체가 타입 이름이 됨
오브젝트의 타입 추론
- 오브젝트 내부의 프로퍼티도 타입 추론이 가능
- 아래의
name
은string
,age
는number
로 추론 가능함
const person1 = {
name: "Jake",
age: 20,
};
person1.name = "JACK"; // 같은 `string` 타입을 할당하기에 에러가 나지 않음
오브젝트의 프로퍼티를 const
로 캐스팅한다면?
- 이전에
const
키워드가 붙었을 때의 타입추론과 동일하게 동작함 name
은Jake
라는 타입이 되어버리고age
는20
이라는 타입이 되어버림
const person2 = {
name: "Jake" as const,
age: 20 as const,
};
person2.name = "JACK"; // 에러 ("Jake" 타입이기 때문에 "Jake" 만 할당 가능)
배열 타입 추론
- 배열 내부 원소 타입의 종류로 추론함
- 숫자만 들어있으면
number[]
로 추론 - 숫자와 문자가 둘 다 들어있으면
(number | string)[]
로 추론
let numbers = [1, 2, 3, 4, 5];
let numbersAndStrings = [1, 2, 3, "4", "5", "6"];
numbers.push("6"); // 에러 (number[] 타입에 문자열을 넣으려 함)
numbersAndStrings.push("7"); // 정상
배열 원소를 꺼내왔을 때의 타입
- 배열 원소를 꺼내오면 기본적으로 배열의 타입을 그대로 받아옴
- 이 때, 인덱스를 초과했는지 알 수는 없음
numbersAndStrings[100]
는 원소를 참조할 수 있는 인덱스를 초과했지만, 정적 분석 때 에러를 내주진 않음
const number = numbers[0]; // number
const inIndex = numbersAndStrings[0]; // number | string
const outOfIndex = numbersAndStrings[100]; // 정상, 인덱스 범위를 초과했는지 알지 못함
튜플
- 튜플은 길이가 고정된 배열을 표현할 수 있는 타입이라고 보면 됨
- 값 집합을 결합하고 싶은데 각 값의 유형이 다를 때 유용함
- 튜플은 배열을
as const
로 묶어서 생성할 수도 있음
// 일반 튜플 생성
let myTuple: [string, number];
myTuple = ["Hello", 100];
// const readonly 튜플 생성
const twoNumbers = [1, 3] as const;
twoNumbers[0] = 2; // 에러
twoNumbers.push(100); // 에러 (read only 는 push 불가능)
const one = twoNumbers[0]; // 1이라는 타입이 됨
const three = twoNumbers[3]; // 에러, 튜플은 길이가 고정되어 인덱스 범위를 초과했는지 알 수 있음
반응형
'Typescript' 카테고리의 다른 글
TS007. 타입스크립트 Union 이란? (0) | 2023.12.28 |
---|---|
TS006. 타입스크립트 타입 캐스팅 및 주의점 (0) | 2023.12.27 |
TS004. 타입스크립트의 Enum 타입 간단하게 알아보기 (0) | 2023.12.27 |
TS003. 타입과 인터페이스 (0) | 2023.12.27 |
TS002. 자바스크립트의 기본(Primitive) 타입과 타입스크립트에만 있는 타입 (0) | 2023.12.26 |