typescript

함수를 타이핑하는 방법을 알아보자

2023. 4. 17. 22:09
목차
  1. 🐕 함수 타입 작성해보기(Writing the Function type)
  2. 👻타입추론 (Inferring the types)
  3. 🥶 선택적 매개변수와 기본 매개변수
  4. 🌞나머지 매개변수 (rest Parameters)
  5. 😋오버로드(Overloads)
  6. 🐶마치며

🐕 함수 타입 작성해보기(Writing the Function type)

let myAdd: (x: number, y: number) => number =
    function(x: number, y: number): number { return x + y; };

화살표 함수처럼 타입을 지정해줄 수 있습니다.

타입스크립트에서 함수의 반환 타입은 다음과 같이 => 화살표 표기를 통해 분명히 할 수 있습니다.

만약 함수가 값을 반환하지 않는다면 비워두는 대신에 void를 사용해 표기합니다.

let myAdd: (x: number, y: number) => void = function (
  x: number,
  y: number,
): void {
  console.log(x + y);
};

이런 식으로 쓸 수 있겠네요!


👻타입추론 (Inferring the types)

우리는 사람이니까 number 타입과 number 타입을 더하면 number 타입이 반환된다는것을 알고있습니다.

그리고 놀랍게도 타입스크립트 역시도 그것을 알고 있습니다.

그것을 우리는 타입 추론이라고 불러요!

let myAdd: (baseValue: number, increment: number) => number =
    function(x, y) { return x + y; };

🥶 선택적 매개변수와 기본 매개변수

타입스크립트에서는 모든 매개변수가 함수에 필요하다고 가정합니다.

이것은 함수가 호출될 때 컴파일러는 각 매개변수에 대해

사용자가 값을 제대로 제공했는지를 검사한다는 뜻입니다.

또한 이 검사에서 함수에 주어진 인자의 수는 함수가 기대하는 매개변수의 수와 일치해야합니다.

 

근데 그러면 이런 의문이 생길 수 있습니다.

난 자바스크립트에서 디폴트 값을 지정해주는 것으로 매개변수와 실제 파라미터에 전달하는 값을

다르게 설정하고 싶었던 적이 많은데??

const param = (num1, num2 = 10){
	return num1 + num2
}

param(5) // 15

이런식으로요!

그럼 타입스크립트에서는 이런 디폴트값 지정 혹은 선택적 매개변수라고 부르는 것을

어떻게 표현할 수 있을까요?

function buildName(firstName: string, lastName?: string) {
    // ...
}

function buildName(firstName: string, lastName = "Smith") {
    // ...
}

옵셔널로 설정해도 되고 자바스크립트에서처럼 =  'Smith'와 같이 표현해도 되네요!


🌞나머지 매개변수 (rest Parameters)

function buildName(firstName: string, ...restOfName: string[]) {
    return firstName + " " + restOfName.join(" ");
}

// employeeName 은 "Joseph Samuel Lucas MacKinzie" 가 될것입니다.
let employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie");

위와 같이 ...문법을 이용해 rest 파라미터를 사용할 것을 명시해주는 것으로

표현할 수 있습니다.

rest파라미터는 배열의 형태로 전달되기때문에 string 요소만을 가지는 배열이어야한다

라고 조건을 준 것이네요!


😋오버로드(Overloads)

let suits = ["hearts", "spades", "clubs", "diamonds"];

function pickCard(x): any {
    // 인자가 배열 또는 객체인지 확인
    // 만약 그렇다면, deck이 주어지고 card를 선택합니다.
    if (typeof x == "object") {
        let pickedCard = Math.floor(Math.random() * x.length);
        return pickedCard;
    }
    // 그렇지 않다면 그냥 card를 선택합니다.
    else if (typeof x == "number") {
        let pickedSuit = Math.floor(x / 13);
        return { suit: suits[pickedSuit], card: x % 13 };
    }
}

let myDeck = [{ suit: "diamonds", card: 2 }, { suit: "spades", card: 10 }, { suit: "hearts", card: 4 }];
let pickedCard1 = myDeck[pickCard(myDeck)];
alert("card: " + pickedCard1.card + " of " + pickedCard1.suit);

let pickedCard2 = pickCard(15);
alert("card: " + pickedCard2.card + " of " + pickedCard2.suit);

자바스크립트에서는 오버로드를 이런식으로 구현할 수 있을 것입니다.

위 예제는 만약 매개변수로 object가 들어온다면

랜덤의 숫자를 반환하고 매개변수로 number가 들어온다면

객체를 반환하는 간단한 함수입니다.

이걸 타입스크립트에서 구현하려면 어떻게 해야할까요?

let suits = ["hearts", "spades", "clubs", "diamonds"];

function pickCard(x: {suit: string; card: number; }[]): number;
function pickCard(x: number): {suit: string; card: number; };
function pickCard(x): any {
    // 인자가 배열 또는 객체인지 확인
    // 만약 그렇다면, deck이 주어지고 card를 선택합니다.
    if (typeof x == "object") {
        let pickedCard = Math.floor(Math.random() * x.length);
        return pickedCard;
    }
    // 그렇지 않다면 그냥 card를 선택합니다.
    else if (typeof x == "number") {
        let pickedSuit = Math.floor(x / 13);
        return { suit: suits[pickedSuit], card: x % 13 };
    }
}

let myDeck = [{ suit: "diamonds", card: 2 }, { suit: "spades", card: 10 }, { suit: "hearts", card: 4 }];
let pickedCard1 = myDeck[pickCard(myDeck)];
alert("card: " + pickedCard1.card + " of " + pickedCard1.suit);

let pickedCard2 = pickCard(15);
alert("card: " + pickedCard2.card + " of " + pickedCard2.suit);

몰? 루

나중에 이해할래잉


🐶마치며

오버로딩 예제코드가 너무 극혐이라서 정신을 잃고 말았습니다.


이해했다고 생각할 때가 가장 무서울 때다.

 

반응형
저작자표시 비영리 (새창열림)

'typescript' 카테고리의 다른 글

ts.config.json 설정 알아보기  (0) 2023.04.18
제네릭  (0) 2023.04.17
리터럴 타입 니가 몬데..  (0) 2023.04.17
타입스크립트의 인터페이스  (0) 2023.04.17
쉽게 시작하는 TypeScript  (2) 2023.04.17
  1. 🐕 함수 타입 작성해보기(Writing the Function type)
  2. 👻타입추론 (Inferring the types)
  3. 🥶 선택적 매개변수와 기본 매개변수
  4. 🌞나머지 매개변수 (rest Parameters)
  5. 😋오버로드(Overloads)
  6. 🐶마치며
'typescript' 카테고리의 다른 글
  • 제네릭
  • 리터럴 타입 니가 몬데..
  • 타입스크립트의 인터페이스
  • 쉽게 시작하는 TypeScript
냠냠맨
냠냠맨
프론트엔드 개발 전반을 다루는 기술 블로그입니다.
냠냠맨
React와 TypeScript를 좋아하는 개발자
냠냠맨
전체
오늘
어제
  • all category (433)
    • CMC (0)
    • best (11)
    • 년간회고 (1)
    • cheetsheet (15)
    • 프로젝트 회고 (3)
    • 서평 (3)
    • SEO Study (1)
    • 프로젝트 진행기 (10)
    • testcode (9)
    • yarnberry (7)
    • css (21)
    • typescript (15)
    • redux (7)
    • react (43)
    • Next.js (9)
    • Nestjs (3)
    • javascript (44)
    • programmers (67)
    • leetcode (41)
    • frontend (41)
    • backjoon (1)
    • Next.js Beta Docs 번역 (12)
    • TIL (15)
      • html (3)
    • Network (12)
      • 간단 정리 시리즈 (2)
      • 질답 준비 (0)
    • 자료구조와 알고리즘 (2)
    • CS (4)
      • OS (1)
    • 취업준비 (2)
    • zoom websocket (2)
    • talk (6)
    • 면접대비 (1)
    • 코드스테이츠 프론트 (5)
    • 간헐적 회고 (17)

블로그 메뉴

  • leetcode
  • programmers
  • javascript
  • html
  • css

공지사항

인기 글

태그

  • 개발자
  • LeetCode
  • CSS
  • 주니어개발자
  • 테오의스프린트17기
  • teosprint
  • 프론트엔드
  • 테오의스프린트
  • JavaScript
  • 말풍선
  • frontend
  • border말풍선
  • 개발
  • 코드스테이츠 #프론트엔드

최근 댓글

최근 글

hELLO · Designed By 정상우.
냠냠맨
함수를 타이핑하는 방법을 알아보자
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.