[typeScript] 4. 대수 타입 / 타입 추론 / 타입 단언

yricog·2025년 1월 25일
0

TypeScript

목록 보기
4/4
post-thumbnail

대수 타입

대수 타입은 여러 개의 타입을 합성하여 새롭게 만들어낸 타입을 뜻한다.
대수 타입의 종류로는 합집합과 교집합 타입이 있다.

1. 합집합(Union) 타입

원시타입의 합집합

let a: string | number | boolean;

a = 1;
a = "hello";
a = true;

배열의 합집합

let arr: (number | string | boolean)[] = [1, "hello", true];

객체의 합집합

type Dog = {
  name: string;
  color: string;
};

type Person = {
  name: string;
  language: string;
};

type Union1 = Dog | Person; // 타입에 타입 할당

let union1: Union1 = { // Dog 타입만 사용 
  name: "",
  color: "",
};

let union2: Union1 = { // Person 타입만 사용 
  name: "",
  language: "",
};

let union3: Union1 = { // 모든 프로퍼티 사용 가능
  name: "",
  color: "",
  language: "",
};

이 때, 공통된 name:"" 프로퍼티 하나만 사용하는 것은 합집합 어디에도 포함되지 않는 타입이기 때문에 사용이 불가하다.🙅🏻‍♀️
⭐️⭐️ 위 그림에서의 교집합은, 프로퍼티의 교집합이 아닌 "값의 교집합"을 뜻한다. 즉, A와 B 두 타입의 모든 조건을 동시에 충족해야 하므로 모든 프로퍼티를 포함하는 타입이 생성되게 된다.

만약, 공통된 name:"" 프로퍼티를 교집합으로 만들고 싶다면 인터페이스와 상속 개념을 통해 구현해볼 수 있다.

interface BaseType { 
    name: string;
}
// BaseType의 프로퍼티를 모두 상속 (name 프로퍼티 자동으로 생김)
interface Dog extends BaseType {
    color: string;
}
interface Person extends BaseType {
    language: string;
}

2. 교집합(Intersection) 타입

위에서 설명한 것과 같이, 교집합은 두 타입의 모든 프로퍼티를 포함하는 타입을 생성한다.

type Dog1 = {
  name: "";
};

type Person1 = {
  age: "";
};

type Intersection1 = Dog1 & Person1;

let intersectionVar: Intersection1 = {
  name: "",
  age: "",
};

하지만 원시 타입의 교집합은 다르다. 아래 예시를 보면 어떤 값도 number 이면서 동시에 string일 수 없기 때문에 원시 타입의 교집합은 공존할 수 없다.

let variable: number & string; // = never

타입 추론

타입스크립트는 변수에 타입을 선언하면 프로그램이 실행되기 이전에 타입 검사를 수행하는 점진적 타입 시스템이다. 이 때 타입을 선언하지 않아도 초기값을 기준으로 자동으로 타입을 추론해주기도 한다.

  • 초기 값이 있을 때
let a = 10;
let b = "hello";

let c = {
  id: 1,
  name: "aaa",
  profile: {
    nickname: "winter",
  },
};
let { id, name, profile } = c;

function func(message = "hello") {
  return "hello";
}
  • 초기 값이 없을 때 (any 타입의 진화)
let d;  // any
d = 10; // 아직 any (값이 할당될 때 any -> number로 진화)
d.toFixed(); // number

d = "string"; // 다시 any (값이 할당될 때 any -> string로 진화)
d.toUpperCase(); // string
  • const로 선언할 때
    • const는 상수이기 때문에 다른 값이 재할당될 일이 없으므로 할당된 값으로 리터럴 타입 표시
const num = 10; // num:10
const str = "hello"; // str:"hello"
  • 배열
let arr = [1, "string"]; // let arr: (string | number)[]

타입 추론 시 범용적으로 변수를 사용할 수 있도록 좀 더 넓은 타입으로 추론해 주는 것을 '타입 넓히기' 라고 한다.


profile
의미와 가치를 쫓는 개발자 ✨

0개의 댓글

관련 채용 정보