본문 바로가기
프로그래밍 개발/Typescript

Typescript 함수 타입

by Jinseok Kim 2021. 5. 5.
반응형

함수 타입

 

 

function getText(name: string, age: number): string {
    const nameText = name.substr(0, 10);
    const ageText = age >= 35 ? 'senior' : 'junior';
    return `name:${nameText}, age: ${ageText}`;

    const v1: string = getText('mike', 23) // 통과
    const v2: string = getText('mike', '23') //'23' age 타입 오류
    const v3: number = getText('mike', 23) //v3 함수 반환 타입 오류
  • 타입스크립트의 함수 타입은 위와 같은 코드가 기본이다.
  • 매개변수에 타입을 각각 정할 수 있으며 함수의 반환 타입 또한 매개변수 () 뒤에  :' 타입' 을 붙여 타입을 정해줄 수 있다.
  • 그래서 매개변수에 들어가는 값들이 정해진 타입과 다르거나 변수로 정의된 함수의 타입이 다르다면 바로 오류를 알아차릴 수 있게 되었다.

 

 

const getText: (name: string, age: number) => string = function (name, age) {
    return 'text';
};

위와 같이 화살표 함수로도 표현할 수 있다.

 

 

 

 

선택 매개 변수

 

function getText(name: string, age: number, language?: string): string {
    const nameText = name.substr(0, 10);
    const ageText = age >= 35 ? 'senior' : 'junior';
    const languageText = language ? language.substr(0, 10) : ''; // ''과 같은 undefinded도 가능해짐
    return `name:${nameText}, age: ${ageText}, language: ${languageText}`;

getText('mike', 23, 'ko') //통과
getText('mike', 23)	//통과
getText('mike', 23, 123) //오류
  • 선택매개 변수는 ' ? ' 을 붙여주면 발동 가능하다. 즉 language?: string은 문자 타입도 가능하고 undefinded도 가능하다고 볼 수 있다.
  • 주의할 상항은 language?: string이 두 번째 인자로 사이에 들어가 있으면 뒤에 있는 세번째 인자로 인하여 오류가 나타난다는 것이다.

 

 

매개변수 기본값

 

function getText(name: string, age: number = 15, language: 'korean'): string {
    return '';
}
console.log(getText('jin')); //통과
console.log(getText('mike', 23)); //통과
console.log(getText('mike', 35, 'english')); //통과
  • 위와 같이 특정 타입의 각각의 숫자, 문자을 입력해주면 그 해당 값의 타입 종류를 타입으로 정한다고 볼 수 있다.
  • 예를 들어 따로 타입을 language: 'korean' 처럼 따로 타입을 정해주지 않아도 'korean'이라는 문자 타입으로 인하여 language는 문자 타입을 가지게 된다.
  • 또 기본값을 사용한 age와 language는 ?가 붙어있는 선택 매개 변수로도 변환되어있다는 것을 확인 할 수 있다.

 

 

 

나머지 매개변수

 

function getText(name: string, ...rest: number[]): string {
    return '';
}
console.log(getText('mike', 1, 2, 3)); //통과
  • 위와 같이 ... 의 나머지 매개변수를 이용하여 두번 째 인자부터 들어 오는 매개변수들을 한꺼번에 타입을 정하고 담을 수 있다.
  • 대신 나머지 매개변수의 타입은 항상 []을 붙여주어 배열로 정의해야한다.

 

 

 

 

this 타입

 

 

function getParam(this: string, index: number): string {
    const params = this.split(',');
    if (index < 0 || params.length <= index) {
        return '';
    }
    return this.split(',')[index];
}
  • this에 타입을 정할때는 매개변수 첫 번째 인자로 this: string 이런식으로 타입을 지정해주면 된다. 
  • 이때 두 번째 인자는 this 때문에 인자가 밀려나도 함수의 매개 변수는 두번 째 인자부터가 첫 번째 매개 변수로 시작된다고 보면된다.

 

 

interface Object {
    getShortKeys(this: object): string[];
}

Object.prototype.getShortKeys = function () {
    return Object.keys(this).filter((key) => key.length <= 3);
};

const obj = {
    a: 1,
    bb: 2,
    ccc: 3,
    dddd: 4
};

console.log(obj.getShortKeys());
//[ 'a', 'bb', 'ccc' ]
  • 위의 코드처럼 프로토타입을 이용하여 메소드 기능을 주입할 수 있다.
  • 대신 interface라는 기능을 통해 Object의 타입을 정의해야만 Object가 프로토타입을 사용할 수 있다.

 

 

오버로드

 

오버로드 예를 위한 함수 실습

 

  • add 함수 작성하기 조건
  • 두 매개변수가 모두 문자열이면 문자열을 반환한다.
  • 두 매개변수가 모두 숫자이면 수자를 반환한다.
  • 두 매개변수를 서로 다른 타입으로 입력하면 안된다.
function add(x: number, y: number): number; //오버로드
function add(x: string, y: string): string; //오버로드
function add(x: number | string, y: number | string): number | string {
    if(typeof x === 'number' && typeof y === 'number') {
        return x + y;
    } else {
        const  result = Number(x) + Number(y);
        return result.toString();
    }
}
const v1: number = add(1, 2); //통과
console.log(add(1, '2')); //오류
  • 위의 코드를 보면 오버로드라는 기능을 이용하였는데 오버로드를 사용하게 되면서 v1 변수의 타입이 오류없이 통과되도록 되었다.
  • 그 이유로 오버로드가 없었다면 두 매개변수가 같은 타입이라도 반듯이 v1이 타입 number로서 반환된다는 보장이 없다고 코드는 읽기 때문이다.
  • 하지만 매개변수가 같은 타입일때 number 혹은 string로 반환된다는 오버로드를 추가해주면 보장을 받고 통과할 수 있게 되었다. 
  • 즉 로직으로는 표현이 되었지만 타입으로는 정의가 안되었다는 의미이다.

 

 

 

name 파라미터

 

export {};

function getText({
    name,
    age = 15,
    language,
} : {
    name: string;
    age?: number;
    language?: string;
}): string {
    const nameText = name.substr(0, 10);
    const ageText = age >= 35 ? 'senior' : 'junior';
    return `name: ${nameText}, age: ${ageText}, language: ${language}`
}

getText({name: `aaa`})
  • 이렇게 name 파라미터를 이용하여 타입을 지정해 줄 수도 있다.
  • age와 language는 선택 매개 변수이므로 매개변수로 안넣어줘도 상관없다.

 

interface Param {
    name: string;
    age?: number;
    language?: string;
}

function getText({ name, age = 15, language }: Param): string {
    const nameText = name.substr(0, 10);
    const ageText = age >= 35 ? 'senior' : 'junior';
    return `name: ${nameText}, age: ${ageText}, language: ${language}`;
}

getText({ name: `aaa` });

name 파라미터를 다른 곳에서 사용하고 싶으면 이렇게 interface을 이용하여 떨어트려 사용해도 된다.

반응형

'프로그래밍 개발 > Typescript' 카테고리의 다른 글

Typescript 타입 호환성  (0) 2021.05.07
Typescript 인터페이스(Interface)  (0) 2021.05.06
Typescript enum 타입  (0) 2021.05.05
Typescript 기본 타입 정의하기  (0) 2021.05.05
Typescript 기본 및 실행하기  (0) 2021.05.04

댓글