함수를 정의하는 방법은 대표적으로 문장(statement) 또는 표현식(expression)이 있다.
Copy function rollDice1 (sides : number ) : number { /* ... */ } // 문장
const rollDice2 = function (sides : number ) : number { /* ... */ } // 표현식
const rollDice3 = (sides : number ) : number => { /* ... */ } // 표현식
타입스크립트에서는 함수 표현식을 사용하는 것이 좋다(고 한다). 함수의 매개변수부터 반환값까지 전체를 함수 타입 으로 선언하여 함수 표현식에 재사용할 수 있기 때문이다. 따라서 불필요한 코드의 반복을 줄인다.
Copy type DiceRollFn = (sides : number ) => number
const rollDice : DiceRollFn = sides => { /* ... */ }
Copy function add (a : number , b : number ) { return a + b }
function sub (a : number , b : number ) { return a - b }
function mul (a : number , b : number ) { return a * b }
function div (a : number , b : number ) { return a / b }
v.s.
Copy type BinaryFn = (a : number , b : number ) => number
const add = (a , b) => a + b
const sub = (a , b) => a - b
const mul = (a , b) => a * b
const div = (a , b) => a / b
아래가 더 깔끔해보인다.
Copy declare function fetch (
input : RequestInfo , ini ?: RequestInit
) : Promise < Response >
아래의 함수를 작성할 수 있다.
Copy async function checkedFetch (input : RequestInfo , init ?: RequestInit ) {
const response = await fetch (input , init)
if ( ! response .ok) {
throw new Error ( 'Request failed: ' + response .status)
}
return response
}
이 코드도 잘 동작하지만, 아래처럼 더 간결하게 작성할 수 있다.
Copy const checkedFetch : typeof fetch = (input , init) => {
const response = await fetch (input , init)
if ( ! response .ok) {
throw new Error ( 'Request failed: ' + response .status)
}
return response
}