Typescript Day 05 - 함수
01 Jun 2021 | TypescriptTypescript Day 05 - 함수
함수
매개변수와 반환값의 타입주석은 일반적으로 생략이 가능하지만 좋지 않다
function 함수명(매개변수1: 타입1, 매개변수2: 타입2): 반환타입 {
//...
}
const 함수명 = (매개변수1: 타입1, 매개변수2: 타입2): 반환타입 => {
//...
}
void 타입
아무런 값을 반환하지 않는 함수는 반환 타입이 void이다.
void는 함수의 반환 타입으로만 사용하도록 하자.
함수 시그니처
변수의 타입처럼 함수의 타입을 시그니처라고 한다.
(타입1, 타입2...) => 반환타입
const print: (string, number) => void = function(name: string, age: number): void {
//...
}
// 매개변수가 없을 시
const pring: () => void = function(): void {
//...
}
Type Alias
함수 시그니처를 별칭으로 만들어서 사용할 수 있다
type print = (string, number) => void;
const a: print = function(name: string, age: number): void {};
undefined 주의사항
interface IName {
name: string
}
function getName(o: IName) {
return o.name;
}
let name = getName(undefined); // 오류
undefined는 최하위 타입이므로 매개변수에 undefined를 넣어도 오류가 발생하지 않지만, return o.name
구문에서 undefined.name
이 되므로 런타임 시 타입 오류가 발생한다.
이를 고려하려면 예외처리를 해주어야한다.
interface IName {
name: string
}
function getName(o: IName) {
return o !== undefined ? o.name : 'unknown';
}
let name = getName(undefined); // unknown
// 선택 속성에 대한 예외 처리
interface IAge {
age?: number
}
function getAge(o: IAge) {
return o !== undefined && o.age ? o.age : 0;
}
let age1 = getAge(undefined); // 0
let age2 = getAge(null); // 0
let age3 = getAge({age: 30}); // 30
선택적 매개변수 (Optional Parameter)
function aa(arg1: string, arg2?: number): void {}
// 선택적 매개변수가 있는 함수의 타입
type OptionalFunc = (string, number?) => void;
콜백 함수
함수 표현식을 매개변수로 받을 수 있다. 매개변수 형태로 동작하는 함수를 콜백함수라고 한다.
const init = (callback: () => void): void => {
console.log(1);
callback();
console.log(2);
}
init(() => console.log(3));
// 1
// 3
// 2
중첩 함수
함수는 변수에 담아 사용할 수 있으므로 또 다른 함수를 중첩할 수 있다.
const calc = (val: number, cb: (number) => void): void => {
let add = (a, b) => a + b;
let multi = (a, b) => a * b;
let result = multi(add(1,2), val);
cb(result);
}
calc(30, (result: number) => console.log(result)); // 90
객체 반환 시 주의
arrow function으로 객체 반환 시 return을 생략하고 다음과 같이 작성하면 오류가 발생한다.
type Person = {name: string, age: number}
const a = (name: string, age: number): Person => {name, age} // 오류, 복합 실핼문으로 해석
const a = (name: string, age: number): Person => ({name, age})
객체 반환 시 중괄호를 괄호로 한번 더 감싸야한다.
매개변수 비구조화 할당
매개변수에도 비구조화 할당 적용이 된다.
type Person = { name: string, age: number };
const print = ({name, age}: Person): void => {
console.log(name, age);
};
색인 key, value로 객체 만들기
key, value 값으로 객체를 만들 수 있다.
const makeObject = (key, value) => ({ [key]: value });
const person = makeObject('name', 'jack'); // { name: jack }
타입스크립트에서는 key, value 형태의 타입을 색인 기능 타입(Indexable Type)이라고 한다
type IndexableType = {
[key: string]: string
}
const makeObj = (key: string, value: string): IndexableType => ({[key]: value});
const person = makeObj('name', 'jack'); // { name: jack }