inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

타입 좁히기

instanceof 관련 질문

120

작성자 없음

작성한 질문수 0

0

안녕하세요!

다름이 아니라 타입 좁히기 도중 type Person을 어떻게 해야
instanceof와 같이 쓸까 고민 중 아래와 같이 직접 인스턴스를 만들어 봤습니다.

class IPerson {
    constructor(public name: string, public age: number) {}
}
func (new IPerson("User", 36));

위 처럼 작성 시 정상작동은 하더라구요.

instanceof에 관해 조금 더 찾아보니 보통 interface와 같이 사용한다 하여 기존 Person 타입도

interface Person {
  name: string;
  age: number;
}

위처럼 바꿔주었는데요. 실수로 제가 age: number; 부분을 지우고 파일을 실행 시켰는데도 불구하고 정상적으로 "User은 36살 입니다." 라고 출력이 되더라구요.

궁금해서 더 찾아보니 instanceof는 생성자를 기준으로 판단한다고 하였는데,

여기서 제가 궁금한 것은 instanceof는 타입 별칭과 별개로 생성자를 기준으로 판단하면 value instanceof IPerson 부분에
value의 타입은 Person이 아닌 IPerson으로 좁혀져야 하는게 아닌지 궁금합니다!!

typescript

답변 2

0

이정환 Winterlood

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

죄송하지만 질문을 제가 정확히 이해하지 못했어요 ㅠㅠ 혹시 궁금한 점을 전체 코드와 함께 올려주실 수 있을까요?

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 초보고양이발자님.

질문 주셔서 감사합니다! instanceof와 관련된 혼란스러운 부분에 대해 설명드리겠습니다.

instanceof는 실제로 객체가 특정 클래스의 인스턴스인지를 확인하는 연산자입니다. 즉, 타입스크립트에서 instanceof는 런타임 시점에 객체의 프로토타입 체인을 따라가면서 해당 객체가 특정 클래스의 인스턴스인지 확인합니다. 이를 위해서는 생성자 함수가 필요합니다.

여기서 중요한 점은 instanceof인터페이스나 타입 별칭이 아닌, 클래스나 생성자 함수와 함께 사용된다는 것입니다. 따라서 instanceof는 타입스크립트에서 타입 체커에 의해 컴파일 타임에 다른 타입 해석을 제공하는 것이 아니라, 런타임에 체크되기 때문에 Person 대신 IPerson으로 좁혀져야 한다는 것이 맞습니다. 하지만 타입스크립트는 인터페이스를 자바스크립트로 컴파일할 때에는 어떤 코드를 생성하지 않으며, 이는 instanceof와는 호환되지 않습니다.

즉, instanceof는 클래스(또는 생성자)가 있는 경우에만 작동하며, 타입 체커는 여전히 타입 체커로 존재합니다. 따라서 코드에서 value instanceof IPerson 을 사용하면 value는 자바스크립트 런타임에서 IPerson 클래스의 인스턴스로 인식되며, 타입스크립트 타입 체커는 IPerson을 기준으로 추측하게 됩니다.

이와 관련하여 더 깊은 이해를 돕기 위한 기존 설명을 확인하실 수 있는 링크를 알려드립니다:
- “instanceof 와 클래스 인터페이스 가 혼동될 때 참고할 및 동작 원리”

이해가 되셨길 바라며, 추가적으로 궁금한 점이 있으시면 언제든지 질문해 주세요. 곧 지식공유자께서도 답변해 주실 것입니다.

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

적절한 타입 찾기 React.ChangeEvent<HTMLInputElemen>

0

25

2

outDir 옵션 추가 후 컴파일 오류 질문

0

62

1

호출 시그니처 질문

0

65

2

서로소 유니언 타입이 discriminated union과 동의어 인가요?

0

75

2

조건부타입소개 중 함수오버로딩 활용 시 인수의타입과 함수의 반환값의 타입이 깨지는 문제

0

65

1

할인쿠폰 관련하여

0

155

2

프론트엔드에서의 인터페이스활용

0

94

2

안녕하세요 이정환님!

0

91

1

Node.js 설치에 관한 질문입니다.

0

79

2

함수 타입 호출 시그니처

0

56

1

35강. 모듈 보강은 라이브러리 파일을 직접 편집해야 하나요?

0

64

2

인터페이스 문법이 있는데 타입 별칭 문법은 왜 있나요?

0

118

4

마우스 호버 시 정보

0

92

2

vite으로 리액트 빌드하기를 업데이트해주세요.

1

89

2

타입가드를 만들어 사용하는 이유가 궁금합니다.

0

83

2

섹션 12가 너무 어려운데... 정상이겠죠..?

0

136

2

선생님.. 알고리즘도 강의해주시면안되나요

0

100

2

선생님은 어떻게 이런걸 아세요?

0

128

1

type: module

0

97

2

7:17초 업캐스팅 질문이있습니다!

0

76

1

슈퍼타입질문

1

62

2

프로젝트 설치

0

103

2

enum은 비원시 타입이면서 열거형 타입이 되는건가요?

0

69

2

함수는 함수타입? 객체타입??

1

94

2