>

알 수없는 객체가 특정 유형인지 어떻게 (런타임에서) 확인할 수 있습니까? 그런 다음 공식적으로 해당 유형으로 변환하고 무언가를 수행 하시겠습니까?

다음과 같이하고 싶습니다 :

const /** {Object} */ someObject = {name: 'Apple', color: 'Red'};
if (someObject is Fruit) {
  // Convert to {Fruit} and do something with it.
  return /** {Fruit} */ (someObject);
}

여기서 Fruit  속성 이름과 색상을 가진 클래스입니다.

보다 구체적으로, 나는 단지 Fruit 를 만들 수 없습니다   JSON.parse 에서 객체를 가져올 때 생성자가있는 객체 .

지금까지 시도했습니다 :

if (someObject instanceof Fruit)

이것은 거짓으로 해결되었습니다. 그리고 나는 시도했다 :

const aFruit = /** @type {Fruit} */ someObj;

그러나 이것은 실제로 아무것도하지 않는 것 같습니다. 즉, 내가 someObj 를 지나갈 때  이름이나 색상이없는 속성은 여전히 ​​ Fruit 로 취급됩니다. .

아마도 더 복잡한/맞춤형 솔루션이 필요합니까? 즉, 이것이 폐쇄에 내장되어 있습니까? 아니면 속성을 직접 확인해야합니까?

  • 답변 # 1

    instanceof  당신이 찾고있는 것입니다. 특정 생성자 함수 (또는 더 나은 ES2015 클래스)에서 주어진 값이 생성되었는지 확인하는 방법입니다.

    const /** {Object} */ someObject = new Fruit('Apple', 'red'); 
    if (someObject instanceof Fruit) {
      // Convert to {Fruit} and do something with it.
      return /** {Fruit} */ (someObject);
    }
    
    

    원래의 예제에서 어떤 물체를 과일로 만드는 것은 무엇입니까? 익명 개체를 사용하고 있습니다. name 가있는 개체입니까?  그리고 color  과일 속성? 이것은 약간 불분명하고 구현에 따라 다릅니다. "객체를 과일로 만드는 이유는 무엇입니까?"

    객체가 과일 인터페이스를 구현하는지 (올바른 속성을 가지고 있는지) 확인하려면 해당 속성을 확인하십시오.

    /**
     * @param {!Object} obj
     * @return {boolean}
     */
    function isFruit(obj) {
      return obj.color && obj.name;
    }
    
    

  • 답변 # 2

    Closure의 타입 시스템은 컴파일 타임에만 존재합니다.

    C에서와 마찬가지로, 캐스트는 단순히 타입 시스템에 "이 값이 증명할 수는 없지만 실제로이 타입임을 보증합니다"라고 말합니다.
    이것이 사실이 아닌 경우 정의되지 않은 동작이 발생합니다 (특히 고급 최적화 사용).

관련 자료

  • 이전 php - 특수 문자 및 코드 삽입 허용
  • 다음 sql - 합 연산으로 피벗 테이블과 같은 쿼리를 만들어야합니다