[ TypeScript ] 함수 타입, Interface

·2023년 10월 29일

함수 타입 정의

파라미터와 반환값

함수에서 타입을 정의할 때에는 입력 및 출력 값에 대한 타입을 정의해야 한다.

function sayName(name: string) :string{
  	return name;
}

옵셔널 파라미터

파라미터 개수만큼 인자를 넘기고 싶지 않을 때 이용하는 방법으로 있어도 되고 없어도 되는 인자에는 ? 를 삽입하여 표기한다.

function sayName(firstName:string, lastName?:string):string {
  return firstName + lastName;
}
sayName(hyein); //hyein

위의 예시에서 ?를 붙인 lastName은 있어도 되고 없어도 된다.
따라서, 생략이 되어도 에러가 나타나지 않는다.

인터페이스

인터페이스는 객체 타입을 정의할 때 사용하는 문법으로,
객체의 속성과 속성 타입, 함수의 파라미터와 반환 타입, 함
수의 스펙(파라미터 개수, 반환값 여부), 배열과 객체 접근 방식, 클래스 등에 사용된다.
또한 무조건 대문자로 시작해야 한다.

객체 타입 정의

예시로 살펴보자

interface MyFoods {
  name: string;
  cost: number; 
}
let banana:MyFoods = { name: 'banana', cost: 7000}

함수 파라미터 타입 정의

객체가 함수의 파라미터로 정의될 때 사용된다.
예시로 살펴보자

interface MyFoods {
  name: string;
  cost: number; 
}

function wantToEat(props:MyFoods){
  console.log(MyFoods.name)
}

반환타입도 마찬가지로 객체로 반환될 때 사용된다.

인터페이스 상속

상속이란?

상속은 객체 간 관계를 형성하는 방법이며, 상위 클래스의 내용을 하위 클래스가 물려받아 사용하거나 확장하는 기법을 말한다.
이 때에 예약어는 extends 를 사용!

인터페이스 상속이 되려면, 상위 인터페이스에서 정의된 타입을 사용해야 하며,
상위 인터페이스가 먼저 정의되어야 한다.
예시로 살펴보자

interface MyFoods {
  name: string;
  cost: number; 
}

interface extends Fruits {
  from: string;
  seaseon: string;
}
interface MyFavorites extends Fruits{
  	isExpensive: boolean;
}

인덱싱 타입 정의

배열 인덱싱 타입 정의

배열을 인덱싱이란, 자바스크립트에서 인덱스를 이용하여 배열의 요소에 접근하는 것을 의미한다. 예시로 살펴보자

interface MyFoods {
  [index:number] :string;
}
let myFavorites: MyFoods = ['요거트', '샐러드', '사과'];
myFavorites[1] //'샐러드'

이때, index 타입을 number 가 아닌 다른 요소로 정의한다면 어떻게 될까?
원래 배열의 인덱스는 숫자여야 하므로, 에러가 발생한다.
만약 인덱스를 다른 요소인 string 등으로 변경해버리면,
해당 인터페이스는 더 이상 배열 타입으로 사용할 수 없다.
따라서, 배열 타입의 인터페이스는 index가 반드시 number 타입을 가지고 있어야 한다.

객체 인덱싱 타입 정의

객체 인덱싱이란, 키와 값 쌍을 만들어 키 값을 이용해 value(값)을 찾아내는 것을 의미한다.
예시를 살펴보자

interface MyFoods {
  [ whatKind: string ] : string;
}
const myFavorites: MyFoods = {
  fresh: 'salad',
  fruits: 'kiwi', 
  meat: 'ducks' 
}
const favorite = MyFoods['fruits'] 

따라서 객체에 접근할 때에는 객체['속성이름'] 으로 접근할 수 있다.

인덱스 시그니처

정확히 속성 이름을 명시하지 않고 속성 이름의 타입과 속성 값의 타입을 정의하는 문법
계속해서 인터페이스가 추가되어야 할 때 작업의 반복을 막기 위한 작업이다.
예시는 다음과 같다

interface MyFoods {
  [ whatKinds : string ] : stirng;
}
let favorites: MyFoods = {
  name: 'yogurt',
  cost: 6000,
  whereToBuy: 'market',
  ...
}

이렇게 인덱스 시그니처를 정의하면,
정의된 인터페이스로 정의한 객체에 무수히 많은 속성 추가가 가능
그러나, 객체의 속성 이름과 개수가 구체적으로 정의되었다면,
인터페이스 자체에 명시하는 게 더 효과적!

profile
new blog: https://hae0-02ni.tistory.com/

3개의 댓글

comment-user-thumbnail
2023년 10월 31일

와 !!!!!!!
스장 블로그 마지막으로 들렀는데 말이죠 !!!
아티클 쓰면서 들었던 의문 , 스터디원들 아티클 읽으면서 들었던 의문이 싹 다 해결되는 매직 .......
흑흑 인덱싱 인터페이스 부분 세미나 때부터 집착광공마냥 스장 괴롭혔었는데 ..... 당신 아티클로 모든게 치유되었슴니다 ...
좋은 아티클 그저 감사할 따름 .... 💗

답글 달기
comment-user-thumbnail
2023년 11월 1일

배열 인덱싱 타입과 객체 인덱싱 타입을 구분해서 살펴보니 더 이해가 잘 되었던 거 같아요!!!!
좋은 글 너무너무 감사합니다 매번 많이 배우고 갑니다!!!🔥

답글 달기
comment-user-thumbnail
2023년 11월 1일

헉 ㅋㅋ 여기 제가 찾던 정답이 있었네용 톡방에 물어보고 나서 이걸 봐버렸지 모얌
배열 인덱싱 타입 정의에 관한 정리!! 너무 잘 이해됐어요 감사합니당 🖤

답글 달기