[typescript] TypeScript에서 클래스 유형 확인

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

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

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

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



답변

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는 같은 문제를 공유합니다. 아직 개발중인 언어이므로 그러한 시설에 대한 제안을하는 것이 좋습니다.

또한보십시오:


답변

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 에서 자세히
알아보십시오.


답변

이를 위해 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


답변