공부

타입스크립트(TS) (2) 인터페이스, 타입 별칭

avocado8 2024. 1. 28. 15:29

 

인터페이스(Interface)

인터페이스를 하나의 타입으로 하여 객체 데이터 할당 가능

이름은 파스칼케이스로 작성 (첫글자 대문자)

중괄호 안에 각 속성에 대한 타입을 명시. 재사용 가능

객체 데이터는 인터페이스의 모든 속성을 맞는 타입의 데이터로 가져야 함

interface User {
  name: string
  age: number
  isValid: boolean
}
const cado: User = {
  name: 'Cado',
  age: 5,
  isValid: true
}

 

? : 선택적 속성

readonly : 읽기 전용 속성

interface User {
  name: string
  readonly age: number //읽기 전용 속성. 할당연산자로 값을 바꿀 수 없음
  isValid?: boolean //선택적 속성. 지정하지 않아도 됨
}
const cado: User = {
  name: 'Cado',
  age: 5,
  // isValid: true
}
cado.age = 22 //오류 발생 (읽기 전용 속성)

 

 

함수 타입 - 호출 시그니처(call signature)

interface GetName {
  //호출 시그니처 - 함수 타입 지정. 소괄호 사용
  //매개변수 타입, 반환 데이터 타입 지정
  (message: string): string
}
interface User {
  name: string
  age: number
  getName: GetName
}
const cado: User = {
  name: 'Cado',
  age: 5,
  getName(message: string) {
    console.log(message)
    return this.name
  }
}
cado.getName('cado!')

 

 

인덱스 가능 타입 - 인덱스 시그니처(index signature)

- 배열, 객체

//배열
interface Fruits {
  //인덱스 시그니처 - 대괄호 사용
  [item: number]: string
  //아이템을 지정하는 키는 숫자, 각 아이템에 할당된 값은 문자
}
const fruits: Fruits = ['Apple','Banana','Cherry']
console.log(fruits[1]) //Banana
//객체
interface User {
  [key: string]: unknown //각 아이템을 식별하는 것은 string, 각 아이템의 데이터 타입은 unknown(무엇이 올지 모름)
  name: string
  age: number
}
const cado: User = {
  name: 'Cado',
  age: 5
}
cado['isValid'] = true
cado['emails'] = ['abc@gmail.com', 'def@naver.com']
console.log(cado) //name, age, isValid, emails를 속성으로 갖는 객체 데이터

 

 

인터페이스 확장 (상속)

interface UserA {
  name: string
  age: number
}
interface UserB extends UserA {
  //UserA의 모든 속성(name, age) 상속받음
  isValid: boolean
}
const cado: UserB = {
  name: 'cado',
  age: 5,
  isValid: true
}
//인터페이스는 동일한 이름으로 여러 개 만들 수 있음
//중복되는 인터페이스 부분에서 특정 속성의 타입 추가 작성 가능
//단 기존에 존재하는 속성을 그대로 적을 때는 타입도 그대로 적어야 함
interface FullName {
  firstName: string
  lastName: string
}
interface FullName {
  middleName: string
  lastName: string
}
const fullName: FullName = {
  firstName: 'avo',
  middleName: 'cado',
  lastName: '5'
}

 


 

타입 별칭(Alias)

- 타입에 별명을 부여. 단일, union, intersection 등 다양한 타입 지정 가능

- type 별명 = 타입

type TypeA = string
type TypeB = string | number | boolean
//User type은 객체 or 튜플 타입
type User = {
  name: string
  age: number
  isValid: boolean
} | [string, number, boolean]

const userA: User = {
  name: 'cado',
  age: 5,
  isValid: true
}
const userB: User = ['nana', 4, false]
type TypeA = string
type TypeB = string | number | boolean
function someFunc(param: TypeB): TypeA {
  switch(typeof param) {
    case 'string':
      return param.toUpperCase()
    case 'number':
      return param.toFixed(2)
    default:
      return 'boolean'
  }
}

 

객체데이터 만들 때 타입별칭 vs 인터페이스?

//타입별칭은 할당 연산자(=) 필요
type TypeUser = {
  name: string
  age: number
  isValid: boolean
}
interface InterfaceUser {
  name: string
  age: number
  isValid: boolean
}

 

기능적 차이는 없음

굳이 권장하자면 인터페이스를 권장한다고 하네요... (인터페이스는 객체 데이터를 전제하니까 근데 걍 그게그거)