매개변수와 리턴값의 타입을 확인하여 할당한다.?으로 표기) // 선택 매개변수
function f1(song: string, name?: string) {} // type { song : string, name? : string }
f1("소향"); // "소향", undefined
f1("소향", "I have nothing"); // "소향", "I have nothing"
f1("소향", undefined); // "소향", undefined
// 선택 매개변수 (기본값 제공)
function f2(song: string, name = "kim") {} // type : { song :string , name ?: string }
f2("소향"); // "소향", "kim"
f2("소향", "I have nothing"); // "소향", "I have nothing"
f2("소향", undefined); // "소향", "kim"
function f3(singer: string, ...songs: string[]) {} // 여러 개의 인자 사용 가능
function f3(singer: string, ...songs: [string, string]) {} // 3개의 인자// JavaScript 함수는 명시적인 반환문이 없을 때에는 자동으로 undefined를 반환하지만,
// TypeScript에서의 void는 함수의 반환 타입을 명시적으로 무시함.
function f(song: string): void {
console.log(""); // OK
return; // OK
return undefined; // OK
return true; // Error
}
function fail(message: string): never {
throw new Error(`error: ${message}`);
}
function work(param: unknown) {
if (typeof param !== "string") {
fail(`param should be a string, not ${typeof param}`);
}
param.toUpperCase();
}
function a(song: string): string {}
매개변수의 타입은 string, 반환타입은 string으로 명시적으로 지정해준다.
반환타입과 매개변수를 정의하고 해당 타입을 변수에 할당하거나 다른 곳에서 사용할 수 있다.type AddFunction = (a: number, b: number) => number; // 함수타입 : AddFunction
const add: AddFunction = (x, y) => x + y;
interface AddFunction {
(a: number, b: number): number;
}
const add: AddFunction = (x, y) => x + y;
// 호출 시그니쳐 : AddFunction
명시적 반환타입 vs 함수타입 vs 호출 시그니처
// 명시적 반환타입 function addWithReturnType(a: number, b: number): number { return a + b; } // 함수타입 type AddFunctionType = (a: number, b: number) => number; const addWithType: AddFunctionType = (x, y) => x + y; // 호출 시그니처 type AddFunctionInterface = { (a: number, b: number): number; } const addWithInterface: AddFunctionInterface = (x, y)=> x + y;
오버로드 시그니처 : 함수가 다양한 입력형태를 받을 수 있도록 정의하는 부분이다.(구문 오류 생성 여부 결정시 확인하는 부분으로, ts 파일이 js 파일로 바뀌면 지워진다.)호출 시그니처 호환성 : 구현 시그니처에 있는 동일한 인덱스의 매개변수에 할당할 수 있어야 함.구현 시그니처 : 실제로 함수의 동작을 정의하는 부분. 오버로드된 시그니처들에 공통적으로 적용되는 코드가 들어가는 부분이다.// 오버로드 시그니처
function f(data: string): string;
function f(data: string, needle: string, haystack: string): string;
function f(getData: () => string): string; // Error : 호출시그니처 호환성x
// 구현 시그니처
function f(data: string, needle?: string, haystack?: string): string {
return needle && haystack ? data.replace(needle, haystack) : data;
}