강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

작성자 없음

작성자 정보가 삭제된 글입니다.

한 입 크기로 잘라먹는 타입스크립트(TypeScript)

타입 좁히기

타입 좁히기 관련 질문

해결된 질문

작성

·

144

0

안녕하세요! 강의 항상 잘듣고있습니다 감사합니다!


강의를 듣다가 질문이 하나 있는데요~
객체에 대한 타입 좁히기 설명하실때 객체의 프로퍼티 존재 여부를 통해 타입을 좁히는거는 이해가 됐는데, 이렇게 하면 다른타입에 동일 프로퍼티가 있는 경우에 허술하지 않을까 생각이되어서요.

type Person = {
  name: string;
  age: number;
};


// value => number : toFixed
// value => string : toUpperCase
// value => Date : getTime
// value => Person : name은 age살입니다.
function func(value: number | string | Date | null | Person) {
  if (typeof value === "number") {
    console.log(value.toFixed());
  } else if (typeof value === "string") {
    console.log(value.toUpperCase());
  } else if (value instanceof Date) {
    console.log(value.getTime);
  } else if (value && "age" in value) {
    console.log(`${value.name}은 ${value.age}살입니다`);
  }
}

예를 들면 여기에

type Animal = {
    name: string;
    age: number;
    breed: string;
}

과 같은 객체들이 있고, value에 유니온 타입으로 정해졌다는 가정하에 이런 객체가 많이 있을경우에 객체마다 특징적인 프로퍼티를 알아본다는 부담도 있을것이고, age를 기준으로 했을때 많이 좁혀지지 않는 경우도 있을건데,

 

실제 규모가 어느정도 있는 페이지 작업의 경우에서는 개발자 입장에서 명확할수록 좋다고 생각해서 굳이 사용될때가 있나 싶기도한데 이런 타입가드 방식은 어떤 경우에 주로 사용되면 좋은지 궁금해서 질문드립니다!

답변 2

0

이정환 Winterlood님의 프로필 이미지
이정환 Winterlood
지식공유자

안녕하세요 이정환입니다.

맞는 말씀입니다. 예리하시군요 👀 이런 상황을 방지하기 위해 서로소 유니온 타입 이라는 기능을 통해 객체 타입을 쉽고 명확하게 구분하는 내용이 뒤에 준비되어 있으니 고 부분도 들어주시면 좋을 것 같습니다 😃

안그래도 다음강의인 서로소 유니온 타입 강의보고 바로 이해돼서 질문했던게 아차싶어가지고 질문삭제하려했는데 안됐네요 ㅜㅜ 답변 감사합니다!!

0

안녕하세요, 인프런 AI 인턴입니다. shion002님.

타입스크립트에서 객체의 타입을 좁히는 데 객체의 프로퍼티를 활용하는 방법은 흔히 사용되지만, 말씀하신 것처럼 서로 다른 타입 간에 동일한 프로퍼티가 있을 경우 모호성이 생길 수 있습니다. 이러한 상황에서 타입가드를 어떻게 구체적으로 적용할지 고민할 수 있습니다.

주어진 코드에서 value에 여러 타입이 혼합된 상황을 처리하고 있고, Person 타입을 구분하기 위해 "age" in value을 사용하고 있습니다. 이 방식은 프로퍼티를 기반으로 타입을 좁히는 전형적인 방법인데, 말 그대로 특정 프로퍼티의 존재 여부를 가지고 타입을 판별하는 것이기 때문에 불명확한 상황이 생길 가능성이 있습니다.

이런 타입 가드 방식은 다음과 같은 경우에 유용하게 사용될 수 있습니다:

  1. 간단한 타입 체커: 다른 타입과 뚜렷하게 구분되는 고유한 프로퍼티를 가지고 있는 경우, 빠르게 간단한 타입 검증이 필요할 때 유용합니다.

  2. 작은 규모의 코드베이스: 코드 베이스가 작거나, 타입 간에 뚜렷한 식별자의 중복이 없는 경우에는 객체 프로퍼티 활용이 직관적이며 실용적일 수 있습니다.

  3. 명확한 타입 간 구분: 동일한 프로퍼티 네임스페이스를 사용하더라도 각 타입이 명확하게 구분되는 경우, 특히 외부 서비스의 API 응답 등 명세에 의한 타입 구분이 필요한 경우에 활용될 수 있습니다.

그러나, 복잡한 프로젝트에서는 개별 타입에 고유 식별자를 추가하는 것을 고려할 수 있습니다. 예를 들어, 각 타입에 type이라는 프로퍼티를 추가하고 값으로 해당 타입의 문자열(‘person’, ‘animal’ 등)을 지정하여 타입 가드를 만들면 명확하고 오류의 가능성을 줄일 수 있습니다.

추가로, 유사한 질문에 대한 기존 사례가 있는데요, 이를 통해 더욱 깊이 있는 이해를 도울 수 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기