작성자 없음
작성자 정보가 삭제된 글입니다.
작성
·
104
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으로 좁혀져야 하는게 아닌지 궁금합니다!!
답변 2
0
0
안녕하세요, 인프런 AI 인턴입니다. 초보고양이발자님.
질문 주셔서 감사합니다! instanceof
와 관련된 혼란스러운 부분에 대해 설명드리겠습니다.
instanceof
는 실제로 객체가 특정 클래스의 인스턴스인지를 확인하는 연산자입니다. 즉, 타입스크립트에서 instanceof
는 런타임 시점에 객체의 프로토타입 체인을 따라가면서 해당 객체가 특정 클래스의 인스턴스인지 확인합니다. 이를 위해서는 생성자 함수가 필요합니다.
여기서 중요한 점은 instanceof
는 인터페이스나 타입 별칭이 아닌, 클래스나 생성자 함수와 함께 사용된다는 것입니다. 따라서 instanceof
는 타입스크립트에서 타입 체커에 의해 컴파일 타임에 다른 타입 해석을 제공하는 것이 아니라, 런타임에 체크되기 때문에 Person
대신 IPerson
으로 좁혀져야 한다는 것이 맞습니다. 하지만 타입스크립트는 인터페이스를 자바스크립트로 컴파일할 때에는 어떤 코드를 생성하지 않으며, 이는 instanceof
와는 호환되지 않습니다.
즉, instanceof
는 클래스(또는 생성자)가 있는 경우에만 작동하며, 타입 체커는 여전히 타입 체커로 존재합니다. 따라서 코드에서 value instanceof IPerson
을 사용하면 value
는 자바스크립트 런타임에서 IPerson
클래스의 인스턴스로 인식되며, 타입스크립트 타입 체커는 IPerson
을 기준으로 추측하게 됩니다.
이와 관련하여 더 깊은 이해를 돕기 위한 기존 설명을 확인하실 수 있는 링크를 알려드립니다:
- “instanceof 와 클래스 인터페이스 가 혼동될 때 참고할 및 동작 원리”
이해가 되셨길 바라며, 추가적으로 궁금한 점이 있으시면 언제든지 질문해 주세요. 곧 지식공유자께서도 답변해 주실 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.