Подтвердить что ты не робот

Как проверить, является ли объект неизменным?

Непрерывный объект может быть экземпляром:

  • Immutable.List
  • Immutable.Map
  • Immutable.OrderedMap
  • Immutable.Set
  • Immutable.OrderedSet
  • Immutable.Stack
4b9b3361

Ответ 1

Существует открытый билет улучшить API, который находится в дорожной карте для 4.0. Пока это не будет реализовано, я предлагаю вам использовать Immutable.Iterable.isIterable() (docs).

Использование instanceof не является надежным (например, возвращает false, когда разные модули используют разные копии Immutable.js)

Ответ 2

Я узнал, что с использованием instanceof для определения того, что объект Immherable небезопасен, небезопасен:

Модуль A:

var Immutable = require('immutable');
module.exports = Immutable.Map({foo: "bar});

Модуль B:

var Immutable = require('immutable');
var moduleA = require('moduleA');
moduleA instanceof Immutable.Map // will return false

API-интерфейс Immutable.js определяет следующие методы проверки того, является ли объект экземпляром Immutable:

и

Последний проверяет, есть ли:

Истинно, если Iterable или любой из его подклассов.

List, Stack, Map, OrderedMap, Set и OrderedSet - все подклассы Iterable.

Ответ 3

Immutable.js уже isImmutable() функция:

 import { isImmutable, Map, List, Stack } from 'immutable';

 isImmutable([]); // false
 isImmutable({}); // false
 isImmutable(Map()); // true
 isImmutable(List()); // true
 isImmutable(Stack()); // true
 isImmutable(Map().asMutable()); // false

Ответ 4

И таким образом вы можете узнать, какой тип неизменяемой переменной Iterable:

const obj0 = 'xxx';
const obj1 = Immutable.fromJS({x: 'XXX', z: 'ZZZ'});
const obj2 = Immutable.fromJS([ {x: 'XXX'}, {z: 'ZZZ'}]);

const types = ['List', 'Stack', 'Map', 'OrderedMap', 'Set', 'OrderedSet'];
const type0 = types.find(currType => Immutable[currType][`is${currType}`](obj0));
const type1 = types.find(currType => Immutable[currType][`is${currType}`](obj1));
const type2 = types.find(currType => Immutable[currType][`is${currType}`](obj2));

console.log(`Obj0 is: ${type0}`); // Obj0 is: undefined
console.log(`Obj1 is: ${type1}`); // Obj1 is: Map
console.log(`Obj2 is: ${type2}`); // Obj2 is: List
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.js"></script>

Ответ 5

Проверка определенных типов обычно приведет к дополнительной работе. Обычно я бы подождал, чтобы заблокировать типы, проверив Карты или Список, но...

Моя мотивация здесь в основном заключается в том, что мой вызов .get из undefined сильно утомится, и правильная инициализация по всему месту помогает, но не захватывает все крайние случаи. Мне просто нужны данные или undefined без поломки. Специфическая проверка типов заставляет меня делать больше работы позже, если я хочу, чтобы она вносила изменения.

Эта более свободная версия решает много других случаев с краями (большинство, если не все, расширяют тип Iterable, у которого есть .get, и все данные в конечном итоге получены), чем делает определенная проверка типа (которая обычно сохраняет только при попытке обновления на неправильный тип и т.д.).

/* getValid: Checks for valid ImmutableJS type Iterable

    returns valid Iterable, valid Iterable child data, or undefined

    Iterable.isIterable(maybeIterable) && maybeIterable.get(['data', key], Map()), becomes
    getValid(maybeIterable, ['data', key], Map())

    But wait! There more! As a result:
    getValid(maybeIterable) returns the maybeIterable or undefined 
    and we can still say getValid(maybeIterable, null, Map()) returns the maybeIterable or Map()            */

export const getValid = (maybeIterable, path, getInstead) =>
  Iterable.isIterable(maybeIterable) && path
    ? ((typeof path === 'object' && maybeIterable.getIn(path, getInstead)) || maybeIterable.get(path, getInstead))
    : Iterable.isIterable(maybeIterable) && maybeIterable || getInstead;


//Here is an untested version that a friend requested. It is slightly easier to grok.

export const getValid = (maybeIterable, path, getInstead) => {
  if(valid(maybeIterable)) {                 // Check if it is valid
    if(path) {                                        // Check if it has a key
      if(typeof path === 'object') {     // Check if it is an 'array'
        return maybeIterable.getIn(path, getInstead) // Get your stuff
      } else {
        maybeIterable.get(path, getInstead)          // Get your stuff
      }
    } else {
      return maybeIterable || getInstead;                 // No key? just return the valid Iterable
    }
  } else {
    return undefined;                       // Not valid, return undefined, perhaps should return false here
  }
}

Просто дай мне то, что я прошу, или скажи мне. Не взорваться. Я считаю, что подчеркивание также делает что-то подобное.

Ответ 6

Это может работать в некоторых случаях:

typeof object.toJS === 'function'

Вы можете использовать этот метод ducktyping, если вы, например, проверяете неизменяемые vs простые объекты (json).