2.6.3 Any 타입(Any type)

2.6.3 Any 타입(Any type)

Any는 양방향으로 다른 어떤 타입과도 호환되는 타입이에요. 한 가지 목적을 위해 존재하는데, 바로 어떤 타입의 값이라도 담는 것입니다. 코드가 갑자기 동적 타입이 되는 것을 방지하기 위해, 이 값을 사용하려면 명시적 캐스팅이 필요해요. 이 제한은 Haxe의 정적 타이핑을 유지하고, 타입 시스템과 관련된 고급 기능·최적화를 계속 사용할 수 있게 해줍니다.

구현은 아주 간단해요:

abstract Any(Dynamic) from Dynamic to Dynamic {}

Any 타입은 값이 실제로 무엇인지, 필드나 연산을 지원하는지에 대해 가정하지 않아요. 이는 사용자가 처리합니다:

class Main {
  static function setAnyValue(value:Any) {
    trace(value);
  }

  static function getAnyValue():Any {
    return 42;
  }

  static function main() {
    // value of any type works
    setAnyValue("someValue");
    setAnyValue(42);

    var value = getAnyValue();
    $type(value); // Any, not Unknown

    // won't compile: no dynamic field access
    // value.charCodeAt(0);

    if (value is String) {
      // explicit promotion, type-safe
      trace((value : String).charCodeAt(0));
    }
  }
}

Any는 필드 접근이나 연산자를 지원하지 않고 모노모프에 바인딩되기 때문에, Dynamic보다 더 타입 안전한 대안이에요. 실제 값으로 작업하려면 명시적으로 다른 타입으로 승격(promote)해야 합니다.

출처: Any type

본문

Any와 Dynamic의 차이

Any는 어떤 타입의 값이든 담을 수 있는 점에서 Dynamic과 비슷하지만, 필드 접근이나 연산자를 지원하지 않아 더 타입 안전해요. Any 타입의 값에 value.charCodeAt(0) 같은 동적 필드 접근은 컴파일되지 않습니다.

명시적 승격

Any 값을 실제로 사용하려면 명시적으로 다른 타입으로 캐스팅(승격)해야 해요. if (value is String)로 타입을 확인한 뒤 (value : String)으로 캐스팅하는 방식이 안전합니다. 이렇게 해야 코드가 조용히 동적 타입이 되어 버리는 것을 방지할 수 있어요.

구현

AnyDynamic을 감싼 추상 타입으로, from Dynamic to Dynamic 변환을 선언해 임의의 값과의 상호 호환을 허용합니다.

더 알아보기