Haxe: проверить, является ли динамический тип объектом

#types #haxe

#типы #haxe

Вопрос:

Мне нужно проверить, является ли var a : Dynamic = {} объектом. Итак, я ожидаю:

 var a : Dynamic;
a = 17.2; check( a ); // false
a = "test"; check( a ); // false
a = [1,2,3]; check( a ); // false
a = 99; check( a ); // false
a = {b:1, c:2}; check( a ); // true
  

Вот что у меня есть (немного отличается от приведенного выше, поскольку проверяет наличие нескольких типов и возвращает перечисление). Все работает, за исключением строки объекта:

 function check( v : Dynamic ) : TokenType {
    if ( Std.is(v, std.Array) ) return TTArray;
    else if ( Std.is(v, std.String) ) return TTString;
    else if ( Std.is(v, Object) ) return TTObject; // What do I need here?
    else if ( Math.isNaN( v ) ) return TTUnknown;
    else if ( Std.is(v, StdTypes.Float) ) return TTNumber;
    else if ( Std.is(v, StdTypes.Int) ) return TTNumber;
    return TTUnknown;
}
  

Обратите внимание — это крошечный фрагмент гораздо большего класса. Тип должен быть Dynamic (например, я не могу использовать Any ).

Заранее спасибо!

Ответ №1:

Здесь у вас есть два варианта:

Первый может быть немного более надежным для вашего варианта использования, поскольку классы являются отдельными ValueType . Например, для целевого объекта JS Type.typeof("string") приведет к TClass(String) , в то время как вы просто получаете true with Reflect.isObject() .