반응형
Jake Seo
제이크서 위키 블로그
Jake Seo
전체 방문자
오늘
어제
  • 분류 전체보기 (715)
    • 일상, 일기 (0)
    • 백준 문제풀이 (1)
    • 릿코드 문제풀이 (2)
    • 알고리즘 이론 (10)
      • 기본 이론 (2)
      • 배열과 문자열 (8)
    • 데이터베이스 (15)
      • Planet Scale (1)
      • MSSQL (9)
      • 디비 기본 개념 (1)
      • SQLite 직접 만들어보기 (4)
    • 보안 (7)
    • 설계 (1)
    • 네트워크 (17)
      • HTTP (9)
      • OSI Layers (5)
    • 회고 (31)
      • 연간 회고 (2)
      • 주간 회고 (29)
    • 인프라 (52)
      • 도커 (12)
      • AWS (9)
      • 용어 (21)
      • 웹 성능 (1)
      • 대규모 서비스를 지탱하는 기술 (9)
    • 깃 (7)
    • 빌드 도구 (7)
      • 메이븐 (6)
      • 그레이들 (0)
    • Java (135)
      • 이펙티브 자바 (73)
      • 자바 API (4)
      • 자바 잡지식 (30)
      • 자바 디자인 패턴 (21)
      • 톰캣 (Tomcat) (7)
    • 프레임워크 (64)
      • next.js (14)
      • 스프링 프레임워크 (28)
      • 토비의 스프링 (6)
      • 스프링 부트 (3)
      • JPA (Java Persistence API) (5)
      • Nest.js (8)
    • 프론트엔드 (48)
      • 다크모드 (1)
      • 노드 패키지 관리 매니저 (3)
      • CSS (19)
      • Web API (11)
      • tailwind-css (1)
      • React (5)
      • React 새 공식문서 요약 (1)
      • HTML (Markup Language) (5)
    • 자바스크립트 (108)
      • 모던 자바스크립트 (31)
      • 개념 (31)
      • 정규표현식 (5)
      • 코드 스니펫 (1)
      • 라이브러리 (6)
      • 인터뷰 (24)
      • 웹개발자를 위한 자바스크립트의 모든 것 (6)
      • 팁 (2)
    • Typescript (49)
    • 리눅스와 유닉스 (10)
    • Computer Science (1)
      • Compiler (1)
    • IDE (3)
      • VSCODE (1)
      • IntelliJ (2)
    • 세미나 & 컨퍼런스 (1)
    • 용어 (개발용어) (16)
      • 함수형 프로그래밍 용어들 (1)
    • ORM (2)
      • Prisma (2)
    • NODEJS (2)
    • cypress (1)
    • 리액트 네이티브 (React Native) (31)
    • 러스트 (Rust) (15)
    • 코틀린 (Kotlin) (4)
      • 자바에서 코틀린으로 (4)
    • 정규표현식 (3)
    • 구글 애널리틱스 (GA) (1)
    • SEO (2)
    • UML (2)
    • 맛탐험 (2)
    • 리팩토링 (1)
    • 서평 (2)
    • 소프트웨어 공학 (18)
      • 테스팅 (16)
      • 개발 프로세스 (1)
    • 교육학 (1)
    • 삶의 지혜, 통찰 (1)
    • Chat GPT (2)
    • 쉘스크립트 (1)
    • 컴파일 (2)
    • Dart (12)
    • 코드팩토리의 플러터 프로그래밍 (4)
    • 플러터 (17)
    • 안드로이드 스튜디오 (1)
    • 윈도우즈 (1)
    • 잡다한 백엔드 지식 (1)
    • 디자인 패턴 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 이펙티브자바
  • 자바스크립트 인터뷰
  • 자바
  • Pre-rendering
  • rust
  • 작업기억공간
  • item7
  • 디자인패턴
  • 러스트
  • bean Validation
  • 싱글턴
  • 메이븐 골
  • 자바스크립트
  • 메이븐 페이즈
  • 자바 검증
  • 도커공식문서
  • 자료구조
  • 메이븐 라이프사이클
  • prerendering
  • 알고리즘
  • pnpm
  • 슬로우 쿼리
  • 빈 검증
  • item9
  • 팩터리 메서드 패턴
  • 프로그래머의 뇌
  • 추상 팩터리 패턴
  • 느린 쿼리
  • item8
  • 이펙티브 자바 item9
  • try-with-resources
  • next js app
  • 자바스크립트 면접
  • 자바 디자인패턴
  • 토비의 스프링
  • serverless computing
  • 참조 해제
  • Java
  • MSSQL
  • 싱글톤
  • 이펙티브 자바
  • Next.js
  • NEXT JS
  • 서버리스 컴퓨팅
  • Javadoc 자바독 자바주석 주석 Comment
  • 플라이웨이트패턴
  • 외래키 제약조건
  • 스프링 검증
  • 객체복사
  • 싱글톤 패턴

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Jake Seo

제이크서 위키 블로그

Typescript

TS010. 타입스크립트 함수 정의 (Function Definition)

2023. 12. 28. 14:03

타입스크립트 함수 선언 방식

  • 타입스크립트 함수 선언 포맷은 아래 예제코드와 같다.
  • 각 파라미터 옆에 파라미터의 타입을 명시해주고, 파라미터 괄호 뒤에는 함수 자체의 반환 타입을 명시해주면 된다.
  • 중요한 것은 파라미터 갯수나 타입을 정확히 맞추지 않으면 타입스크립트 검증에 의해 에러가 난다.
function foo(param1: string, param2: string): string {
  return `${param1}, ${param2}`;
}

foo(); // 에러, 파라미터 갯수 부족
foo("a"); // 에러, 파라미터 갯수 부족
foo("a", 1); // 에러, 파라미터 타입이 하나 틀림
foo("a", "b"); // 정상 동작

참고로 반환 타입인 string 은 타입 추론에 의해 잘 추론되어 사실 따로 기재해주지 않아도 된다.

옵셔널 파라미터 (Optional Parameter)

  • 파라미터 중 들어와도 되고 안들어와도 되는 것에 옵셔널 기호(?)를 붙여 옵셔널 파라미터로 만들 수 있다.
  • 아래 코드는 param2 가 옵셔널 파라미터기 때문에 있어도 되고 없어도 에러가 나지 않는다.
function bar(param1: number, param2?: number) {
  if (param2) {
    return param1 + param2;
  }

  return param1;
}

console.log(bar(10, 20)); // 정상
console.log(bar(10)); // 정상
  • 아래 코드는 없어도 param2 에 기본 값이 들어가게 세팅했기 때문에 마찬가지로 없어도 에러가 나지 않는다.
function bar2(param1: number, param2: number = 20) {
  if (param2) {
    return param1 + param2;
  }

  return param1;
}

console.log(bar2(10)); // 정상
console.log(bar2(10, 30)); // 정상

나머지 파라미터 (Rest Parameter)

  • 나머지 파라미터의 경우는 배열의 형태로 들어오기 때문에 이전에 list 형태의 타입을 정의할 때랑 동일하게 정의해주면 된다.
  • 아래는 string 혹은 number 가 들어올 수 있게 정의한 것이다.
function bar3(...params: (string | number)[]) {
  return params.map((x) => `-> ${x}`);
}

bar3("x", "y", "z", 1, 2);

반환 타입 (Return type)

  • 반환 타입에 대해서는 웬만하면 타입 유추 (Type inference) 기능이 정상적으로 작동한다.
  • 아래 bar4 예제의 경우 number 를 받아서 number 의 연산 결과를 반환하니 유추가 매우 쉽다.
function bar4(x: number, y: number) {
  return x + y;
}

bar4(10, 20);
  • 아래처럼 랜덤의 경우도 유니온 타입으로 반환 타입을 잘 유추한다.

picture 0

"랜덤" | 100 으로 유니온으로 반환 타입을 잘 유추하고 있다.

function random() {
  return Math.random() > 0.5;
}

function randomReturn() {
  return random() ? "랜덤" : 100;
}

randomReturn();
  • 애로우 함수도 일반 함수처럼 반환 타입을 입력하면 된다.
const bar6 = (p1: number, p2: number): number => {
  return p1 - p2;
};

반환 타입을 꼭 입력해야 하는 경우

재귀함수의 반환 타입 (Return type of recursive function)

  • 위의 케이스의 경우엔 반환 타입을 사실상 명시하지 않아도 된다.
  • 근데 재귀함수의 경우 타입스크립트에서 반환타입을 정상적으로 유추해내지 못한다.
  • 재귀함수는 반환 타입을 반드시 명시해주는 것이 좋다.
// 반환타입 없음 에러 발생
function factorial(n: number) {
  if (n <= 1) {
    return 1;
  }
  return n * factorial(n - 1);
}
// 반환타입 추가 정상 작동
function factorial(n: number): number {
  if (n <= 1) {
    return 1;
  }
  return n * factorial(n - 1);
}

const result = factorial(5); // result is of type number

함수 오버로드 반환 타입

  • 오버로드할 때는 반환 타입을 입력해주어야 한다.
function greet(name: string): string;
function greet(age: number): number;
function greet(input: any): any {
  if (typeof input === "string") {
    return `Hello, ${input}`;
  } else if (typeof input === "number") {
    return input * 2;
  }
}

const greeting = greet("Alice"); // greeting is of type string
const ageResult = greet(25); // ageResult is of type number

복잡한 로직의 반환 타입

  • 중간에 복잡한 로직이 끼인 경우, 타입스크립트가 간혹 반환 타입을 추측하기 어려워한다.
interface User {
  id: number;
  name: string;
}

function processUser(user: User): { success: boolean; userName: string } {
  // Complex logic goes here
  const userName = user.name.toUpperCase();
  const success = userName.length > 0;

  return { success, userName };
}

const processedUser = processUser({ id: 1, name: "John" });

공개 API 의 반환 타입

  • 공개 API 에서는 반환타입을 명시적으로 줘야 훨씬 읽기 쉽고 이해하기 쉽다.
interface ApiResponse {
  status: number;
  data: any;
}

function fetchUserData(userId: number): ApiResponse {
  // API call logic
  return { status: 200, data: { userId, name: "Alice" } };
}

const userData = fetchUserData(123);

특수 반환 타입 1: void

  • 아무 것도 반환하지 않는 경우 void 를 반환 타입으로 이용하면 된다.
function noReturn(): void {
  console.log("no return");
}

특수 반환 타입 2: never

  • 반환하는 상황 자체가 일어나지 않는 경우 never 를 반환 타입으로 이용하면 된다.
function noReturn2(): never {
  throw "no return but throw";
}
function noReturn3(): never {
  while (true) {}
}
반응형
저작자표시 비영리 (새창열림)

'Typescript' 카테고리의 다른 글

TS012. 타입스크립트 함수 오버로딩  (0) 2023.12.28
TS011. 타입스크립트로 함수 시그니처 선언하기  (0) 2023.12.28
TS009. 타입스크립트의 내로잉 (Narrowing) 이란?  (0) 2023.12.28
TS008. Typescript Intersection 이란?  (0) 2023.12.28
TS007. 타입스크립트 Union 이란?  (0) 2023.12.28
    'Typescript' 카테고리의 다른 글
    • TS012. 타입스크립트 함수 오버로딩
    • TS011. 타입스크립트로 함수 시그니처 선언하기
    • TS009. 타입스크립트의 내로잉 (Narrowing) 이란?
    • TS008. Typescript Intersection 이란?
    Jake Seo
    Jake Seo
    ✔ 잘 보셨다면 광고 한번 클릭해주시면 큰 힘이 됩니다. ✔ 댓글로 틀린 부분을 지적해주시면 기분 나빠하지 않고 수정합니다. ✔ 많은 퇴고를 거친 글이 좋은 글이 된다고 생각합니다. ✔ 간결하고 명료하게 사람들을 이해 시키는 것을 목표로 합니다.

    티스토리툴바