TypeScript에서 클래스 유형 확인


240

ActionScript에서는 is 연산자를 사용하여 런타임에 유형을 확인할 수 있습니다 .

var mySprite:Sprite = new Sprite(); 
trace(mySprite is Sprite); // true 
trace(mySprite is DisplayObject);// true 
trace(mySprite is IEventDispatcher); // true

변수 (확장자 또는)가 특정 클래스 또는 TypeScript와 인터페이스인지 감지 할 수 있습니까?

언어 사양에서 그것에 대해 아무것도 찾을 수 없습니다. 클래스 / 인터페이스로 작업 할 때 있어야합니다.

답변:


318

4.19.4 instanceof 연산자

instanceof연산자는 상관 형 또는 '기능'인터페이스 유형의 서브 타입이 될 어떤 형으로 왼쪽 피연산자 객체 유형 또는 유형 파라미터 유형 및 오른쪽 피연산자를 필요로한다. 결과는 항상 부울 기본 유형입니다.

그래서 당신은 사용할 수 있습니다

mySprite instanceof Sprite;

이 연산자는 ActionScript에도 있지만 더 이상 사용해서는 안됩니다.

ActionScript 3.0에 새로 도입 된 is 연산자를 사용하면 변수 또는 표현식이 지정된 데이터 유형의 멤버인지 테스트 할 수 있습니다. 이전 버전의 ActionScript에서 instanceof 연산자는이 기능을 제공했지만 ActionScript 3.0에서는 instanceof 연산자를 사용하여 데이터 유형 멤버 자격을 테스트하지 않아야합니다. x instanceof y 표현식은 x의 프로토 타입 체인에서 y의 존재 여부를 확인하기 때문에 isof 연산자를 instanceof 연산자 대신 사용해야합니다 (ActionScript 3.0에서는 프로토 타입 체인이 상속 계층).

TypeScript instanceof는 같은 문제를 공유합니다. 아직 개발중인 언어이므로 그러한 시설에 대한 제안을하는 것이 좋습니다.

또한보십시오:


54

TypeScript에는 런타임에 변수 유형을 확인하는 방법이 있습니다. 유형 술어 를 리턴하는 유효성 검증 함수를 추가 할 수 있습니다 . 따라서 if 문 안에서이 함수를 호출 할 수 있으며 해당 블록 내의 모든 코드를 생각한 형식으로 안전하게 사용할 수 있습니다.

TypeScript 문서의 예 :

function isFish(pet: Fish | Bird): pet is Fish {
   return (<Fish>pet).swim !== undefined;
}

// Both calls to 'swim' and 'fly' are now okay.
if (isFish(pet)) {
  pet.swim();
}
else {
  pet.fly();
}

https://www.typescriptlang.org/docs/handbook/advanced-types.html 에서 자세히 알아보십시오.


29
이것은 런타임 유형 검사가 아니라 객체에 특정 속성이 있는지 확인하는 것입니다. 이것은 유니온 유형에 좋을 수 있으므로이 특별한 경우에는 효과가 있지만 실제로는 이와 같은 모든 것에 대해 "isThingy"를 만들 수는 없습니다. 또한 물고기와 새가 수영을 할 수 있다면 운명입니다. Std.is(pet, Fish)유형, 인터페이스 등에서 작동 하는 신뢰할 수있는 유형 검사 기능이있는 Haxe를 사용하게되어 기쁩니다 .
Mark Knol

4
이 답변이 도움이되었다는 것을 알았지 만 좀 더 정확하도록 조정할 수 있다고 생각합니다. 그 isFish자체는 생성 된 술어이며, 그 본문은 한 줄짜리 술어 일 필요는 없습니다. 이것의 장점은 컴파일러가 컴파일 타임에 적절한 함수를 이해하지만 내부 코드 isFish는 런타임에 실행 된다는 것 입니다. 가드에 instanceof문장을 포함시킬 수도 있습니다 return pet instanceof Fish( 예 : 인터페이스가 아니라 클래스라고 가정).하지만 컴파일러가 instanceof직접 이해하기 때문에 불필요 합니다.


@MarkKnol 실제로 런타임 검사이지만 유추 된 형식을 이해할 수있는 기능을 typescript로 제공합니다 (즉, 런타임시 테스트하므로 X 또는 Y 유형이라고 믿을 수 있습니다).
Flavien Volken

3
(pet as Fish)tslinter가에 대해 불평하므로 사용을 고려할 수도 있습니다 (<Fish>pet). 참조 tslint 문서
브라이언

1

이를 위해 instanceof연산자를 사용할 수 있습니다 . MDN에서 :

instanceof 연산자는 생성자의 프로토 타입 속성이 객체의 프로토 타입 체인에 나타나는지 테스트합니다.

어떤 프로토 타입과 프로토 타입 체인을 모르는 경우 찾아 보는 것이 좋습니다. 또한 개념을 명확히 할 수있는 JS (TS는 이와 관련하여 유사하게 작동합니다) 예제가 있습니다.

    class Animal {
        name;
    
        constructor(name) {
            this.name = name;
        }
    }
    
    const animal = new Animal('fluffy');
    
    // true because Animal in on the prototype chain of animal
    console.log(animal instanceof Animal); // true
    // Proof that Animal is on the prototype chain
    console.log(Object.getPrototypeOf(animal) === Animal.prototype); // true
    
    // true because Object in on the prototype chain of animal
    console.log(animal instanceof Object); 
    // Proof that Object is on the prototype chain
    console.log(Object.getPrototypeOf(Animal.prototype) === Object.prototype); // true
    
    console.log(animal instanceof Function); // false, Function not on prototype chain
    
    

이 예제의 프로토 타입 체인은 다음과 같습니다.

동물> Animal.prototype> Object.prototype

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.