인프런 커뮤니티 질문&답변
타입가드를 만들어 사용하는 이유가 궁금합니다.
작성
·
14
0
사용자가 타입이 맞는지 체크하기 위해 직접 만든 함수가 맞을까요?
결국 animal에 isBark란 프로퍼티가 존재하는지 확인하고 싶다는 건데 첫 번째로 가독성을 높이고 싶고, 두 번째로 isBark 말고도 다른 복잡한 조건이 추가된다면 하나의 함수로 묶어서 코드 앞부분에서 미리 검증하고 싶어서 사용하는 게 맞을까요?
그리고 이전 질문에서
function isDog(animal: Animal) animal is Dog {
return "isBark" in animal;와의 차이를 비교했을 때 위의 경우는 isBark가 존재하지 않아도 에러가 나지 않는다고 하셨었는데 그렇다면
사용자 정의 타입 가드는 타입이 일치하지 않을 때 False를 리턴하는 것보단 에러를 발생시키는 게 유리한지
어차피 에러를 발생시키는 게 목적이라면 animal.isBark가 들어간 아무 표현식이라도 함수 내부에서 사용한다면 적용이 가능할 텐데
return animal.isBark !== undefined를 사용하는게 가장 깔끔한 방식이라 이렇게 쓰는 건지
가 궁금합니다.
답변 2
0
안녕하세요 이정환입니다.
우선 커스텀 타입가드를 사용하는 주된 이유는 "가독성"을 증진시키기 위함이 맞습니다. 복잡한 조건문을 하나의 함수 호출로 대체하는 효과가 있습니다.
"false를 리턴하는 것보다 에러를 발생시키는게 유리한지" 라고 질문을 주셨는데요 타입 오류가 발생하면 아예 프로그램이 실행되지 않기 때문에 타입 오류는 발생시켜서는 안됩니다. 따라서 animal.isBark !== undefined 대신에 "isBark" in animal 같은 표현을 사용하는 것 입니다.
추가로 "어짜피 에러를 발생시키는게 목적이라면 ..." 이라고 말씀하셨는데, 에러를 발생시키는것은 목적이 아닙니다. 커스텀 타입 가드의 목적은 인수로 전달한 값이 질의하는 타입이 맞는지 true, false 형태로 반환하는 것이 목적입니다.
0
안녕하세요, 인프런 AI 인턴입니다.
타입가드를 사용하는 이유와 관련된 몇 가지 주요 사항을 요약하여 설명드리겠습니다. 님의 질문에 대한 답변을 아래에 제공합니다.
1. 사용자 정의 타입 가드의 역할
사용자 정의 타입 가드는 특정 조건을 검사하여 타입을 좁히는 데 사용됩니다. 예를 들어 Animal 타입을 받고 Dog 인지 확인하는 함수는 다음과 같은 이유로 유용합니다:
가독성: 코드의 가독성을 높여줍니다. 복잡한 조건이 필요할 경우, 이 조건들을 함수로 묶어 적절한 이름으로 사용하는 것이 읽기 쉽고 유지보수하기 용이합니다.
재사용성: 타입 가드를 만들어 두면 여러 곳에서 동일한 타입 체크가 필요할 때 반복해서 사용할 수 있습니다.
2. 타입 가드의 오류 처리
일반적으로 타입 가드는 boolean 값을 반환하여 조건에 따라 다른 처리를 할 수 있도록 설계됩니다. 하지만 타입이 일치하지 않을 경우에 에러를 발생시키는 것은 개발자가 특정 상황에서 필요에 따라 사용할 수 있는 방법입니다.
return animal.isBark !== undefined또는return "isBark" in animal;같은 구문으로 타입을 확인할 수 있습니다.이 두 구문 간의 차이는 전자는
"isBark"프로퍼티가undefined인지 검사하여 해당 타입이 맞는지를 확인하고, 후자는"isBark"라는 키가 존재하는지를 확인합니다.
3. 기타 고려 사항
- 타입 가드를 사용하여 에러를 발생시키기보다는, 타입을 안전하게 확인하고 이후의 코드 흐름에서 이에 맞는 처리를 하는 것이 초점이 됩니다. 예를 들어, 특정한 상태를 만족하지 않으면
false를 반환하고, 코드 흐름에서 이를 보고 에러를 던지는 것은 개발자의 선택입니다.
관련 유사 질문과 답변 링크
위의 내용에서 확인할 수 있듯이, 타입 가드는 코드의 안전성과 가독성을 높이는 데 유리하며, 상황에 따라 다양한 방식으로 구현될 수 있습니다. 함수의 반환 값을 통한 처리는 상황에 맞게 유연하게 사용하면 좋습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





아하
"isBark" in animal이라고 사용할 때에는Animal에서isBark가 사라지면 코드상의 오류가 검출되지 않는다고 하셨는데 제가 실행 시점에 에러가 발생한다고 잘못 이해한 것 같습니다. 컴파일 에러 처럼 코드 작성 중에 경고를 띄워 주기 때문에 검사가 용이하다는 뜻이었군요