ABOUT ME

Today
Yesterday
Total
  • [TS] 함수
    codeStates front-end/Typescript 2023. 3. 12. 19:46
    반응형

     

    목차

     

     

     

    📌  함수

     

     

    📍함수 매개변수

     

     💁매개변수란? 함수를 정의할 때 사용되는 변수를 의미

    타입 스크립트에서 함수는 자바스크립트처럼 생성할 수 있으나, 매개변수의 타입과 반환 타입을 설정해야 한다.

     

    // 타입을 선언하지 않으면 any로 간주한다
    function sing(song : string){
    	console.log('Singing : ${song}!');
    }

     

     

    🔗 필수 매게변수와 선택적 매게변수

     

    필수 매게변수

     

    타입스크립트는 함수에 정의된 모든 매개변수가 함수에 필요하다고 가정한다.

     

    function sendGreeting (message : string, userName: string):void {
         console.log (`${message}, ${userName}`);
     }
     
     sendGreeting('Hello', 'Mark');

     

    🙋‍♀️

    매개변수가 2개 이상인 함수 호출 시 argument를 하나만 전달하고 싶다면??

     

    Error!!! 타입스크립트 컴파일 시 모든 매게변수가 들어오지 않았으므로 에러가 난다.

    👉👉 해결법  : 선택적 매게변수

     

    선택적 매게변수

     

    선택적 매게변수란, 물음표를 사용하여 매게변수를 선택 사항으로 표시 할 수 있음을 의미한다.

     

    function sum(a: number, b?: number): number {
      return a + b;
    }
    sum(10, 20); // 30
    sum(10); // 타입 에러 없음
    
    // 위 코드와 동일
    function sum(a: number, b: number | undefined): number {
      return a + b;
    }
    sum(10, 20); // 30
    sum(10); // 타입 에러 없음

     

    ❗️❗️❗️주의사항

    선택적 매게변수들은 반드시 필수 매게변수 뒤에 위치시켜야 한다.

    하나의 매개변수가 선택적 매개변수가 되면 선택적 매개변수의 오른쪽에 위치한 다른 매개변수들 또한

    선택적 매개변수가 되어야 하기 때문이다.

     

    🔗 기본 매게변수와 나머지 매게변수

    기본 매게변수

     

    기본 매게변수를 사용하면 선택적 매게변수가 | undfined 가 아닌, default 값을 갖게 할 수 있다. 

     

     

    '선택적 매게변수' = '할당할 값'

     

    function sendGreeting (message : string, userName?: string = 'there'):void {
         console.log (`${message}, ${userName}`);
     }

     

     

    나머지 매게변수

     

    나머지 매개 변수는 (마지막 인자가 ...argumentName으로 표시됨) 함수에서 여러 인자를 배열로 받는다.

     

    function iTakeItAll(first, second, ...allOthers) {
        console.log(allOthers);
    }
    iTakeItAll('foo', 'bar'); // []
    iTakeItAll('foo', 'bar', 'bas', 'qux'); // ['bas','qux']

     

     

    📍 반환 타입

     

    암묵적으로 타입스크립트는 반환 타입을 정한다.

    아래 코드를 보면 타입을 정하지 않아도 반환 타입은 number이다.

     

    const foo = (num1: number, num2: number) => {
    	return num1 + num2; // number
    };

     

    함수 또한 명시적 반환타입이 유용한 경우가 있다.(ex -> num : number)

     

    • 가능한 반환값이 많은 함수가 항상 동일한 타입의 값을 반환하도록 강제
    • 타입스크립트는 재귀 함수의 반환 타입을 통해 타입을 유추하는 것을 거부
    • 수백 개 이상의 타입스크립트 파일이 있는 매우 큰 프로젝트에서 타입스크립트 타입 검사 속도를 높일 수 있다.

     

     

    📍 함수 타입

     

    함수 자체에서도 타입을 지정할 수 있다

    함수 타입은 어떤 타입을 가진 매게변수를 받아 어떤 타입의 값을 반환하는지를 말한다

     

    변수: (매개변수의 타입) => 반환값의 타입

     

    let combineValues: (a:number, b:number) => number;

     

    // 이 코드는 함수 타입을 명시하지 않았기 때문에 Error 
    function add(n1: number, n2: number) {
    	return n1 + n2;
    }
    
    let combineValues;
    
    combineValues = add; 
    combineValues = 5;
    
    // 타입을 명시해주어야 에러가 나지 않는다
    function add(n1: number, n2: number) {
    	return n1 + n2;
    }
    
    // ✨ 함수타입 지정
    let combineValues: (a: number, b: number) => number;
    
    combineValues = add;

     

     매게변수 타입 추론

     

    매개변수에 기본 값이 있으면 매개변수에 값을 할당 하지 않아도 된다.

    더불어 기본 값이 있으면 굳이 인자 타입을 선언하지 않아도 된다. 

     

    function sum(a: number, b = 100): number { // 매개변수 기본 값이 있으면 굳이 인자 타입을 선언하지 않아도 된다 (타입 추론)
       return a + b;
     }

     

    함수 타입 별칭

     

    타입 별칭이란? 재사용하는 타입에 더 쉬운 이름을 할당

    함수 매게변수도 함수 타입을 참조하는 병칭을 입력할 수 있다

     

    type NumberToString = (input : number) => string;
    ...

     

     

    🔗  그 외 반환 타입 void, never

     

    void

    이 함수는 아무것도 반환하지 않는다

     

    const greetMaker = (phrase: string): void => {
    	console.log(phrase);
    };

     

    never

    (의도적으로)항상 오류를 발생 시키거나 무한 루프를 실행하는 함수

     

    const greetMaker = (phrase: string): never => {
    	console.log(phrase);
    };

     

     

    🔗  함수 오버로드

    동일한 이름에 매개 변수만 다른 여러 버전의 함수를 만드는 것을 함수의 오버로딩이라고 한다.

     

     

    🙋‍♀️

    Function overloading은 언제 사용하고 왜 사용 할까?

    파라미터만 달라지고, 비슷한 로직이 반복되는 경우에 사용할 수 있다.

    코드의 중복을 줄이고 재사용성을 높이기 위해 사용된다.

     

    // 문제 없는 함수 오버로딩 선언
    class User {
        constructor(private id: string) {}
        setId(id: string): string;
        setId(id: number): string;
    }
     
     
    // Error
    class User {
        constructor(private id: string) {}
        // 선언 시에 에러는 나지 않지만 오버로딩 함수 정의 시에 에러
        setId(id: string): void;
        setId(id: string): number; // 반환 타입 다름
        setId(radix: number, id: number): void; // 인수 순서 다름
    }
    반응형

    'codeStates front-end > Typescript' 카테고리의 다른 글

    [TS] 클래스  (0) 2023.03.20
    [TS] 인터페이스  (0) 2023.03.12
    [TS] 배열과 튜플  (0) 2023.03.12
    [TS] 객체  (0) 2023.03.06
    [TS] 타입 시스템, 유니언과 리터럴  (0) 2023.03.06

    댓글

Designed by Tistory.