본문으로 바로가기

Function

category JavaScript/TypeScript 2021. 3. 11. 17:42

자바스크립트와 같이 기명 함수와 익명 함수 그대로 사용할 수 있다

함수 타입

함수에 타입 붙이기

// 기명 함수
function add(x: number, y: number): number {
    return x + y;
}
// 익명 함수
let myAdd = function(x: number, y: number): number { return x + y };

파라미터의 타입을 보고 리턴값의 타입을 파악할 수 있으므로 생략이 가능

함수 타입 작성하기

위는 그저 함수에 타입을 붙인 것이고 함수 전체의 타입을 설정하는 법도 존재한다

let myAdd: 
(value: number, increase: number) => number /* 여기까지 함수 타입 */ =
function(x: number, y: number): number { return x + y; }; // 실제 함수 선언

타입의 추론

함수 전체 타입을 표기했다면 뒤에서 선언할 함수에는 타입을 명시하지 않아도 타입스크립트가 알아서 추론해준다

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

이러한 타입 추론을 contextual typing이라고 부른다

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

자바스크립트와 다르게 타입스크립트는 기본적으로 명시된 파라미터가 모두 필요하다고 가정한다

function needs(first: string, second: string) : string{
    return first+second;
}

// needs('asdf',); 에러

앞서 살펴본 interface처럼 선택적으로 매개변수를 받을 수 있게 설정이 가능하다

function needOptional(first: string, second?: string) : string{
    return second ? first+second : first;
}

console.log(needOptional('asdf',));

다만 선택적 매개변수를 설정할 때는 순서를 유의해야한다

나머지 매개변수

자바스크립트에선 매개변수를 따로 설정해두지않아도 arguments로 추가적으로 매개변수들을 받아 올 수 있었지만 타입스크립트에서는 추가적인 조치가 필요하다

// Rest Parameters

function rest(first:string, ...others:string[]){
    return first + ' ' + others.join(' ');
}

console.log(rest('str','str2','str3','str4'));

this

let deck = {
    suits: ["hearts", "spades", "clubs", "diamonds"],
    cards: Array(52),
    createCardPicker: function() {
        return function() {
            let pickedCard = Math.floor(Math.random() * 52);
            let pickedSuit = Math.floor(pickedCard / 13);
            try{
                return {suit: this.suits[pickedSuit], card: pickedCard % 13};
            }catch (e){
                return e;
            }
        }
    }
}

let cardPicker = deck.createCardPicker();
let pickedCard = cardPicker();

console.log("card: " + pickedCard.card + " of " + pickedCard.suit);

'JavaScript > TypeScript' 카테고리의 다른 글

유틸리티 타입  (0) 2021.10.24
Generics  (0) 2021.03.12
클래스  (0) 2021.03.03
인터페이스  (0) 2021.03.02
기본 타입  (0) 2021.03.01