타입스크립트 기초 - 19

Stulta Amiko·2022년 8월 8일
0

타입스크립트 기초

목록 보기
19/24
post-thumbnail

대수 데이터 타입

대수 데이터 타입이라는것이 있다.
Algebraic Data Type 줄여서 ADT라고도 부르는것이다.

여기서 대수라는것은 대수학의 대수와 같은 의미이다.
구글에 대수 데이터 타입에 대해 검색하면 여러 결과가 나오지만 이해하기 힘든 내용이 많다.

hope 라는 언어에서 처음 사용된 ADT는 함수형 프로그래밍의 시초이다.

합집합 타입

합집합 타입은 또는의 의미인 '|' 기호로 다양한 타입을 연결해서 만든 타입을 말한다.

type NumberOrString = number|string
let ns: NumberOrString = 1
ns = 'hello'

위 코드는 number와 string 모두 담을 수 있는 합집합 타입을 이용한 코드이다.

교집합 타입

교집합 타입은 and의 의미인 & 기호로 다양한 타입을 연결해서 만드는 타입을 말한다.
교집합 타입의 대표적인 예는 두 개의 객체를 통합해서 새로운 객체를 만드는 것이다.

export const mergeObjects =  <T,U>(a: T,b: U): T&U =>({...a,...b})

mergeObjects.ts

import { mergeObjects } from "./mergeObjects";

type Inameable = {name: string}
type IAgeable = {age: number}

const nameAndAge: Inameable&IAgeable = mergeObjects({name: 'jack'},{age: 20})
console.log(nameAndAge)

mergeObjects-test.ts

위 코드를 실행하면 name:'jack' age:20 이 나오게 된다.

합집합 타입 구분

다음과 같은 인터페이스가 세개 있다.

interface ISquare {size: number}
interface IRectangle {width: number,height: number}
interface ICircle{radius: number}

위 인터페이스로 만든 객체는 다음과 같다.

const square: ISquare = {size: 10}
const rectangle: IRectangle = {width: 4, height: 5}
const circle: ICircle = {radius: 10}

이 객체를 받아서 계산을 수행하는 calcArea 라는 함수를 만든다고 치면

console.log(calcArea(square),calcArea(rectangle),calcArea(circle))

calcArea 의 매개변수는 여러 타입을 받을 수 있어야한다.

type IShape = ISquare | IRectangle | ICircle
export const calcArea = (shape; IShape): nubmer =>{
return 0
}

위와같이 코드를 짜게되면 합집합 타입이여서 모든 타입을 받을 수 있게 되지만
세 타입의 경우 서로 계산방법이 다르기 때문에 문제가 발생한다.
따라서 이를 해결하기 위해 식별 합집합을 이용한다.

식별 합집합

식별 합집합 구문을 사용하려면 합집합 타입을 구성하는 인터페이스들이 모두 똑같은 이름의 속성을 가지고 있어야한다.

export interface ISquare {tag: 'square', size: number}
export interface IRectangle {tag: 'rectangle', width: number,height: number}
export interface ICircle{tag: 'circle',radius: number}

export type IShape = ISquare|IRectangle|ICircle

IShape.ts

import { IShape } from "./IShape";

export const calcArea = (shape: IShape): number =>{
    switch(shape.tag){
        case 'square' : return shape.size * shape.size
        case 'circle' : return shape.radius * shape.radius * Math.PI
        case 'rectangle': return shape.width * shape.height
    }
    return 0
}

calcArea.ts

import { calcArea } from "./calcArea";
import { IRectangle,ICircle,ISquare } from "./IShape"; 

const square: ISquare = {tag:'square',size: 10}
const rectangle: IRectangle =  {tag: 'rectangle', width: 5, height: 4}
const circle: ICircle = {tag: 'circle', radius: 6}

console.log(
    calcArea(square),calcArea(rectangle),calcArea(circle)
)

calcArea-test.ts

이렇게 실행하게 되면 파라미터의 타입이 다르더라도 인식해서 정상적인 결과를 출력하게 된다.

0개의 댓글