해결된 질문
작성
·
50
0
안녕하세요~ 강의 잘 보고있습니다.
영상은 [함수 오버로딩] 8:30 정도이구요.
function func(...rest: number[]) {
const [a, b, c] = rest;
if (typeof b === "number" && typeof c === "number") {
console.log(a + b + c);
} else {
console.log(a * 20);
}
}
매개변수를 강사님께선 b?:number, c?:number로 없을 수도 있다라고 표시해준다 하셨는데
저는 강의를 보던 중 위 코드가 떠올라서 적용해보았는데 결과 값은 같았습니다.
매개변수가 더 늘어날 수 있다는 점에서 이점이 있어 보이는데 강사님이 알려주신게 더 나은 코드일까요?
위의 코드에 문제점이 있어 알려주시면 감사 드리겠습니다.
답변 1
1
안녕하세요 이정환입니다.
말씀하신대로 number[] 타입으로 정의하셔도 문제가 발생하지는 않습니다.
대신 아래의 예제 코드처럼 두번째, 세번째 인수의 타입이 정확하게 추론되지 않는 문제가 있습니다.
function func(a: number): void;
function func(a: number, b: number, c: number): void;
function func(...rest: number[]) {
const [one, two, three] = rest;
one.toFixed();
two.toFixed();
three.toFixed();
}
원래라면 함수 내부의 변수 two와 three는 number | undefeind 타입이어야 합니다. 첫번째 오버로드 시그니쳐로 호출했을 경우에는 값이 없기 때문이죠
그러나 지금처럼 number[] 타입으로 매개변수 타입을 정의해두면, 이 배열의 모든 요소의 타입이 number 타입으로 고정되어버립니다.
결과적으로 위와 같이 안전하지 못한 연산을 하게 되어 타입 오류를 발생시킬 염려가 있습니다.