본문 바로가기
frontend/TypeScript

[TypeScript] TypeScript 함수 타입 이해 - 3

by 신림쥐 2024. 4. 14.
728x90

 

     


     

    함수 타입

    - 매개변수, 반환값 타입 지정이 필요하다.

    - 매개변수 필수 값이 아닌 경우 ? 를 사용하여 체크 할 수 있지만, 필수값 매게변수랑 값이 사용 시 필수값 뒤에 위치해야 한다. 

    // 함수 타입 기본 정의
    function func(a: number, b: number): number {
      return a + b;
    }
    
    const add = (a: number, b: number): number => a + b;
    
    // 함수의 매개변수
    function introduce(name: string, age: number, tall?: number) {
      console.log(name);
      if (typeof tall === "number") {
        console.log(tall + 10);
      }
    }
    introduce("kim", 20, 180);
    introduce("kim", 20);
    
    function getSum(...rest: number[]) {
    // function getSum(...rest: [number, number, number]) {
      let sum = 0;
      rest.forEach((v) => (sum += v));
    
      return sum;
    }
    getSum(1, 2, 3);

     

     

    함수 타입 표현식, 호출 시그니처

    - 함수 타입 표현식: 함수의 매개변수를 따로 별칭과 함께 함수 타입에 지정하는 방법

    - 호출 시그니처 :함수 타입 표현식을 간결하여 지정하는 문법

    // 함수 타입 표현식
    type Operation = (a:number, b:number) => number;
    
    // function func(a: number, b: number): number {}
    // const func: (a: number, b: number) => number = (a, b) => a + b;
    
    const add: Operation = (a, b) => a + b;
    const sub: Operation = (a, b) => a - b; // 재사용 가능
    
    // 호출 시그니처
    type Operation2 = {
      (a: number, b: number): number;
    }
    const add2: Operation2 = (a, b) => a + b;
    const sub2: Operation2 = (a, b) => a - b;

     

     

    함수 타입 호환성

    - 특정 함수 타입을 다른 함수 타입으로 취급해도 괜찮은지 판단하는 기준

    - 호환 확인 대상: 반환값, 매개변수 

    // 함수 타입 호환성
    
    // 1. 반환값 호환성
    type A = () => number;
    type B = () => 10;
    
    let a: A = () => 10;
    let b: B = () => 10;
    
    a = b;
    // b = a; // error - 반환값이 Down Cast 인경우는 호환되지 않는다.
    
    // 2. 매개변수 호환성
    // 2.1. 매개변수 갯수가 같음
    type C = (value: number) => void;
    type D = (value: 10) => void;
    
    let c: C = (value) => {};
    let d: D = (value) => {};
    
    // c = d; // error - 매개변수가 Up Cast 인경우는 호환되지 않는다.
    d = c;
    
    type Animal = {
      name: string;
    };
    type Dog = {
      name: string;
      color: string;
    };
    
    let animalFunc = (animal: Animal) => {
      console.log(animal.name);
    };
    let dogFunc = (dog: Dog) => {
      console.log(dog.name);
      console.log(dog.color);
    };
    
    // animalFunc = dogFunc; // error - 매개변수가 Up Cast 인경우는 호환되지 않는다.
    dogFunc = animalFunc;
    
    // 2.2. 매개변수 갯수가 다름
    type Func1 = (a: number, b: number) => void;
    type Func2 = (a: number) => void;
    
    let func1: Func1 = (a, b) => {};
    let func2: Func2 = (a) => {};
    
    func1 = func2;
    // func2 = func1; // error - 매개변수가 적은 타입으로만 호환이 가능하다.

     

     

    함수 오버로딩

    - 자바스크립트에서는 함수 오버로딩 개념이 없다. 타입스크립트에서만 있다.

    - 하나의 함수를 매개변수 갯수나, 반환값을 다르게 하여 재정의 하는 것

    // 함수 오버로딩
    
    // 오버로딩 시그니처 작성
    function func(a: number): void; // 타입스크립트 오버로딩 문법 : {} 사용 안함
    function func(a: number, b: number, c: number): void;
    
    // 실제 구현
    function func(a: number, b?: number, c?: number) { // 최소한의 오버로딩 매개변수를 위해 작성
      if(typeof b === "number" && typeof c === "number"){
        console.log(a+b+c);
      }else{
        console.log(a);
      }
    }
    
    // 호출
    // func(); // error - 해당 함수 없음
    func(1);
    // func(1, 2); // error - 해당 함수 없음
    func(1, 2, 3);

     

     

    사용자 정의 타입 가드

    - 반환값 타입을 지정하는 is 타입스크립트 문법을 활용하여 타입을 확인하는 타입 가드 함수를 만들어서 사용하는 방법

    - 외부 라이브러리를 사용하거나 소르소 문법을 작성하지 못하는 상황에서 사용하기 좋다.

    // 사용자 정의 타입 가드
    type Dog = {
      name: string;
      isBark: boolean;
    };
    
    type Cat = {
      name: string;
      isScratch: boolean;
    };
    
    type Animal = Dog | Cat;
    
    function isDog(animal: Animal): animal is Dog { // 함수가 return 한다면 Dog 타입으로
      return (animal as Dog).isBark !== undefined;
    }
    function isCat(animal: Animal): animal is Cat { // 함수가 return 한다면 Cat 타입으로
      return (animal as Cat).isScratch !== undefined;
    }
    
    function warning(animal: Animal) {
      if (isDog(animal)) {
        console.log(animal.isBark ? "짖습니다" : "안짖어요");
      } else {
        console.log(animal.isScratch ? "할큅니다" : "안할퀴어요");
      }
    }

     

     

    출처

    • 한 입 크기로 잘라먹는 타입스크립트(TypeScript)
    728x90