본문으로 건너뛰기

240115

아이템 12 함수 표현식에 타입 적용하기

  • 함수의 매겨변수에 타입 선언을 하는 것보다, 함수 표현식 전체 타입을 정의하는 것이 코드도 간결하고 안전하다.
  • 다른 함수의 시그니처와 동일한 타입을 가지는 새 함수를 작성하거나, 동일한 타입 시그니처를 가지는 여러 개의 함수를 작성할 때는 매개변수의 타입과 반환 타입을 반복해서 작성하지 말고, 함수 전체의 타입 선언을 적용해야한다.
// 함수의 매개변수와 반환값에 타입을 적용하는 방법
function rollDice1(sides: number): number {
return Math.floor(Math.random() * sides) + 1;
}

// 위 함수처럼 함수선언문보단, 화살표함수 또는 표현식으로 작성하는 걸 권장.
const rollDice2: (sides: number) => number = (sides) => {
return Math.floor(Math.random() * sides) + 1;
};

// 함수의 매개변수부터 반환값까지 전체를 함수 타입으로 선언하는 것을 권장함.
type DiceRollFn = (sides: number) => number;
const rollDice3: DiceRollFn = (sides) => {
return Math.floor(Math.random() * sides) + 1;
};

  • 다른 함수의 시그니처를 참조하려면 typeof fn을 사용한다.
async function checkedFetch(input: RequestInfo, init?: RequestInit) {
const response = await fetch(input, init);

if (!response.ok) {
// 비동기 함수 내에서는 거절된 프로미스로 변환합니다.
throw new Error(response.statusText);
}

return response;
}

const checkedFetch: typeof fetch = async (input, init) => {
const response = await fetch(input, init);

if (!response.ok) {
// 비동기 함수 내에서는 거절된 프로미스로 변환합니다.
throw new Error("Request failed :" + response.status);
}

return response;
};