프로그래밍 언어/TypeScript
TypeScript | Return 타입 명시, Function 타입 명시, 콜백함수 타입 명시
hyuga_
2024. 6. 9. 18:16
Return 타입 명시
매개변수 받는 괄호 오른쪽에 콜론(:) 찍고 return 타입 명시 가능.
// 올바른 return 타입 설정
const combine = (arg1: number, arg2: number): number => {
return arg1 + arg2
}
// 에러
const combine = (arg1: number, arg2: number): String => {
return arg1 + arg2
}
console.log(combine(1, 2))
void 타입
자바 등 다른 프로그래밍 언어에는 있는 반환타입이다. 자바스크립트에는 void가 없었지만 타입스크립트에서 추가되었다.
void는 return 값이 없는 경우이다.
// void 타입 - return 값이 없음 (엄밀히 말하면, 기술적으로는 undefined 리턴)
const printSum = (arg1: number, arg2:number): void => {
console.log(arg1 + arg2)
}
만약 이를 억지로 console.log로 찍어보면 undefined 값을 반환한다.
즉, 기술적으로 보면 아무것도 반환하지 않는 것은 아니고, JS의 데이터타입인 undefined를 반환하는 것이다.
사실 undefined 자체도 리턴타입으로 지정할 수 있기 때문에 개발자로 하여금 헷갈리게 하는 포인트이다. 차이점이 있다면, undefined를 리턴으로 넣고 싶으면 빈 return을 반환하는 경우에 사용하면 된다는 것.
void는 명시적으로 '이 함수에는 return 자체가 없어요.' 를 나타내는 거고, undefined는 '그냥 return만 해요'를 나타내는 것이라 볼 수 있다.
// undefined 타입 - 빈 return일 때
const printMinus = (arg1: number, arg2: number): undefined => {
console.log(arg1 - arg2)
return
}
printMinus(6, 3)
Function 타입 명시
함수에 대한 포인터를 특정 식별자에 넣어놓고 재활용하는 경우가 생길 수도 있는데, TS에서는 함수 타입도 지원한다.
예를 들어 '이 식별자에 어떤 함수 포인터를 할당할지는 모르겠지만, 매개변수는 이 타입 이 타입 들어와야하고, return 값은 저 타입으로 줄 거에요.' 라고 미리 명시하는 것이다.
// Function 타입 지정하기
let combineValues: (arg1: number, arg2: number) => number // function 타입 지정
const combineNumbers = (arg1: number, arg2: number): number => arg1 + arg2
combineValues = combineNumbers // 타입 에러 안남
console.log(combineValues(1, 2)) // 3
const combineString = (arg1: String, arg2: String): String => `${arg1}${arg2}`
combineValues = combineString // 타입 에러 발생
console.log(combineValues('Hello', 'World')) // 컴파일 에러. but 실행은 됨. ('HelloWorld')
콜백에 대한 타입 명시
콜백함수에 대해서도 타입 지정을 미리 할 수 있다.
// 매개변수 타입 지정 - 콜백에 대한 타입 지정
const doSomething = (arg1: number, arg2: string, cb: (cbArg1?: string) => void): string =>{
cb()
const result: string = arg1.toString() + arg2;
console.log('doSomething:', result)
return result
}
const callbackSomething = (cbArg1?: string): void => {
console.log(cbArg1 + ' World')
}
doSomething(123, 'arg2', () => callbackSomething('Hello')) // 콜백 전달 시엔 익명함수로
/*
출력:
Hello World
doSomething: 123arg2
*/