해결된 질문
작성
·
181
·
수정됨
0
안녕하세요! 강사님, 넘넘 강의 잘듣고 있습니다! 오버로드 시그니처로 삼항연산과 같이 조건이 특정지어지는 경우이면 instanceof 로 타입좁히기를 사용하는 것이 더 알맞는거 아닌가요? any를 지양해야하는 경우를 알려주신 것과는 반하는 예시인거 같아서요! any를 사용하신 이유가 따로 있으신지 질문드립니다!
답변 2
0
안녕하세요 이정환입니다.
아래의 코드와 관련된 질문이겠죠 ..?! (질문하시려는 코드가 정확히 어떤 포인트인지는 명시되어 있지 않아 제 나름대로 유추를 해 보았습니다)
function removeSpaces<T>(text: T): T extends string ? string : undefined {
if (typeof text === "string") {
return text.replaceAll(" ", "") as any;
} else {
return undefined as any;
}
}
위 코드에서 instanceOf
를 사용해 타입을 줄이면 반환값에 as any
같은 단언을 사용하지 않아도 되지 않느냐 라고 질문을 주신거라면 그렇지 않습니다. 실제로 직접 해보시면 타입오류가 발생합니다.
그 이유는 오버로드 시그니쳐를 사용하는 경우가 아니라면, removeSpace 함수의 반환값은 무조건 T extends string ? string : undefined
으로 추론되기 때문이에요 그래서 as T extends string ? string : undefined
로 단언을 해 주거나 as any
로 단언을 해 주어야 합니다.
function removeSpaces<T>(text: T): T extends string ? string : undefined;
function removeSpaces(text: any) {
if (typeof text === "string") {
return text.replaceAll(" ", "");
} else {
return undefined;
}
}
이어서 위와 같은 상황에서는 그럼 any 타입을 꼭 사용할 이유가 있었냐고 물으신다면 unknown으로 대체하셔도 됩니다. 위 상황에서는 text 매개변수의 값으로 무슨 타입의 값이 들어올지 예상할 수 없기 때문에 any를 사용한 것 뿐입니다.
이때 함수 내부에서는 text 매개변수의 타입이 오버로드 시그니쳐로 인해 타입이 자동으로 string 또는 undefeind으로 좁혀지니 안전성에 대한 위험은 없다고 보셔도 무방합니다.
마지막으로 any 타입을 절대 절대 어떤 경우에도 사용하지 말라고 말씀을 드리지는 않습니다. any 타입도 특별한 경우에는 나름의 활용새가 있기에 "되도록 사용하지 않는것이 좋다" 라고 말씀을 드리고 싶습니다.
PS. 혹시나 제가 질문의 요지를 정확히 파악하지 못한 것 일수도 있으니 instacneOf 를 사용해 이 코드를 더 개선할 수 있다면 답글로 꼭 남겨주세요!
0
안녕하세요, 인프런 AI 인턴입니다.
woodsorrelo님께서 질문해 주신 내용에 대해 말씀드리겠습니다. 타입스크립트에서 any
타입은 모든 종류의 타입을 수용할 수 있는 타입으로, 타입 체크를 무시하기 때문에 개발 중 타입 안정성을 잃을 수 있습니다. 따라서 타입스크립트에서 any
타입 사용을 최소화하는 것이 일반적인 권장 사항입니다.
조건부 타입과 타입 좁히기에 있어서 instanceof
를 사용하는 것은 정확한 타입 검증을 할 수 있어 더 안전하고 바람직한 방법입니다. 특히, 타입이 명확할 경우 instanceof
나 typeof
를 사용하면 타입스크립트 컴파일러가 더 나은 타입 검사 결과를 제공하게 됩니다.
강의 중 any
타입이 사용된 부분이 있었다면, 이는 교육적인 목적으로 유연성을 강조하기 위한 예시일 수 있습니다. 그러나 프로젝트나 실무 환경에서는 타입 안전성을 확보하기 위해 any
타입을 피하고, 정확한 타입을 명시하거나 타입 추론을 활용하는 것이 좋습니다.
관련된 강의의 질문과 답변에서 유사한 질문을 다룬 게시물을 참고하시면 도움이 될 것입니다. 이 게시물에서는 타입 가드 또는 타입 좁히기와 관련된 설명도 확인할 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.