결론적으로 Type Assertion은 좋은 방법의 타입 지정은 아니다.
강제적으로 타입을 지정하는 것이기 때문이다.
함수를 작성할 때 return 해주는 데이터 타입이 무조건!!! 100퍼센트 무슨 일이 일어나도 string이다 라고 확신할 때! 만 사용하도록
function jsStrFunc(): any {
return "hello";
}
const result = jsStrFunc();
//원래라면 result는 any 타입이라 string의 length 프로퍼티에 접근할 수 없다
console.log(result.length);
// result as string으로 작성하면 무조건 string이라고 강제로 타입 지정
console.log((result as string).length);
//이렇게 작성해도 같은 의미
console.log((<string>result).length);
원래라면 length를 사용할 수 없는데 뭔가 업그레이드 되었는지 콘솔에 5가 잘 띄어진다. 근데 방심하면 안되는게 분명 any인데 string 프로퍼티에 접근 가능했단 말이지? 이것도 충분히 오류를 일으킬 수 있지 않을까?
만약 return에 숫자를 작성해보면?
function jsStrFunc(): any {
return 2;
}
const result = jsStrFunc();
console.log(result.length);
console.log((result as string).length);
console.log((<string>result).length);
//undefined
//undefined
//undefined
코드를 작성하는 시점에서 에러는 나지 않지만 런타임에서 undefined를 내뱉는다.
이렇게 간단한 코드라 어디가 잘못되었는지 쉽게 찾을 수 있지만 복잡한 코드라고 가정했을 때, Assertion을 사용해도 에러가 발생하지 않는다면...?
처음부터 디버깅 해야하는 문제가 생긴다.
따라서 진짜진짜진짜 확신할 때만 사용한다.
느낌표를 이용한 Type Assertion
function findNumber(): number[] | undefined {
return undefined
}
const results = findNumber()
results!.push(2)
//또는
const results = findNumber()!
results.push(2)
절대 undefined이 아니라 무조건 숫자이다. 라고 장담할 때 느낌표를 붙인다.