본문 바로가기
언어/TypeScript

함수

by seacode 2025. 4. 11.

기본적인 함수의 타입 선언은 다음과 같다.

function sum(a: number, b: number): number {
  return a + b;
}

그냥 JS의 매개변수와 반환 값에 타입을 붙여준게 끝이다.

 

함수 파라미터

- TypeScript 에서 함수의 인자는 모두 필수값으로 간주되고, 컴파일러가 이를 꼭 확인한다.

- 따라서 undefined, null 이라 할지라도 인자로 꼭 넘겨줘야한다.

function sum(a: number, b: number): number {
  return a + b;
}
sum(10, 20); // 30
sum(10, 20, 30); // error
sum(10); // error

* 파라미터 초기화는 JS랑 동일하다
function sum(a: number, b = '100'): number {
  return a + b;
}
sum(100, undefined); // 200
sum(10, 20, 30); // error
sum(10); // 110

 

- 만약 기존 JS처럼 파라미터 개수를 꼭 맞추지 않고 싶다면 ? 기호를 통해 우회 가능하다.

function sum(a: number, b?: number): number {
  return a + b;
}
sum(10, 20); // 30
sum(10, 20, 30); // error
sum(10); // 10

 

ES6+ REST 문법이 적용된 파라미터

- REST 파라미터: 매개 변수의 수를 정해놓지 않고, 사용자가 넣고 싶은 만큼 넣게 해주는 기능

- 사용 방법은 JS랑 동일하다.

function sum(a: number, ...nums: number[]): number {
  let totalOfNums = 0;
  for (let key in nums) {
    totalOfNums += nums[key];
  }
  return a + totalOfNums;
}

 

this

- 함수에서 this를 잘못 사용했을 때 감지할 수 있다.

- 아래와 같이 this가 가리키는 것을 명시함으로써 타입에러를 방지할 수 있는 것.

function 함수명(this: 타입) {
  // ...
}
interface Vue {
  el: string;
  count: number;
  init(this: Vue): () => {};
}

let vm: Vue = {
  el: '#app',
  count: 10,
  init: function(this: Vue) {
    return () => {
      return this.count;
    }
  }
}

let getCount = vm.init();
let count = getCount();
console.log(count); // 10

- vue 인터페이스를 정의하고, vue 타입을 따르는 객체 vm을 생성함.

- vm의 init 함수는 this를 명시적으로 vue 라고 지정했기 때문에, this.count 는 vm.count 를 참조하게 됨.

- return () => {...} 은 자신이 정의된 위치의 this를 캡처하므로, this.count 는 vm.count 를 가리킴.

- 실행흐름 : vm.init() 실행 -> () => this.count 리턴 -> getCount() 실행 -> 내부에서 this.count 실행. (이때 this는 vm이므로 10을  출력함)

 

콜백으로 함수가 전달되었을 때의 this

- 일반적인 this와 다르게 콜백으로 함수가 전달됐을 때의 this는 다음과 같이 구분해줄 수 있다.

interface UIElement {
  // 아래 함수의 `this: void` 코드는 함수에 `this` 타입을 선언할 필요가 없다는 의미입니다.
  addClickListener(onClick: (this: void, e: Event) => void): void;
}

class Handler {
    info: string;
    onClick(this: Handler, e: Event) {
        // 위의 `UIElement` 인터페이스의 스펙에 `this`가 필요없다고 했지만 사용했기 때문에 에러가 발생합니다.
        this.info = e.message;
    }
}
let handler = new Handler();
uiElement.addClickListener(handler.onClick); // error!

 

애초에 interface의 스펙에 맞춰서 핸들러를 구현한다고 하면 아래와 같이 바꿔야한다.

class Handler {
    info: string;
    onClick(this: void, e: Event) {
        // `this`의 타입이 void이기 때문에 여기서 `this`를 사용할 수 없습니다.
        console.log('clicked!');
    }
}
let handler = new Handler();
uiElement.addClickListener(handler.onClick);

 

'언어 > TypeScript' 카테고리의 다른 글

Union Type, Intersection Type  (0) 2025.04.14
enum 자료형  (0) 2025.04.13
인터페이스  (0) 2025.04.13
기본 타입  (0) 2025.04.11
어째서 타입스크립트인가?  (0) 2025.04.11