How to check if object is Immutable?

后端 未结 6 803
有刺的猬
有刺的猬 2020-12-29 01:44

Immutable object can be an instance of:

  • Immutable.List
  • Immutable.Map
  • Immutable.OrderedMap
6条回答
  •  臣服心动
    2020-12-29 01:59

    Checking specific types will generally cause more work later on. Usually I would wait to lock types in by checking for Map or List, but...

    My motivation here is mostly that my call .get of undefined poops itself really hard, and initializing properly all over the place helps, but doesn't catch all edge cases. I just want the data or undefined without any breakage. Specific type checking causes me to do more work later if I want it to make changes.

    This looser version solves many more edge cases(most if not all extend type Iterable which has .get, and all data is eventually gotten) than a specific type check does(which usually only saves you when you try to update on the wrong type etc).

    /* 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's 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
      }
    }
    

    Just give me what I am asking for or tell me no. Don't explode. I believe underscore does something similar also.

提交回复
热议问题