Lodash: применить метод экземпляра класса, если значение экземпляра не равно нулю или не определено

#typescript #lodash

#typescript #Lodash

Вопрос:

Предположим, у нас есть следующий пример:

 class Person {
  surname: string;
  firstname: string;

  getFullName(separator: string) {
    return this.surname   separator   this.firstname;
  }
}

const person = ...

const fullName = _.ifNotNull(person, value => value.getFullName('-'));
  

Существует ли эквивалент ifNotNull функции в Lodash, которая применяла бы метод из параметра объекта, только если он не равен нулю или не определен?

Комментарии:

1. Вам не нужен Lodash. person?.getFullName('-')

2. @MoshFeu ты имеешь person?person.getFullName('-'):default ? в виду, что это может быть более чистым с помощью функции типа _.IfNotNull

3. Нет, он имеет в виду person?.getFullName , это называется необязательной цепочкой . Попытка использовать функцию для достижения того, что уже было встроено, кажется бессмысленной. Это не выглядит чище, это выглядит как пустая трата времени.

4. typescriptlang.org/play ? #код/…

5. @DaneBrouwer Ну, я работаю с angular 8, для которых требуется TypeScript>= 3.4.0 и <3.6.0, но необязательные цепочки поддерживаются только typescript@3.7.0-beta и выше, так что я не могу использовать его прямо сейчас

Ответ №1:

Вы можете использовать Lodash

На самом деле, у Lodash есть функция, которую вы ищете, она вызывается _.invoke . В приведенном выше примере вы могли бы написать:

 const fullName = _.invoke(person, "getFullName", "-");
  

И это будет работать так, как ожидалось. Итак, как это _.invoke работает?

  • _.invoke имеет следующую подпись: _.invoke(object, path, [args]) . Он вызывает метод по пути (который может быть вложенным путем, а также просто именем метода) внутри объекта с this привязкой к объекту.

Могу ли я быстро попробовать это в браузере?

Конечно! Я создал Codepen, в котором вы можете попробовать этот и другие способы сделать то же самое прямо в вашем браузере. Просто не забудьте открыть консоль браузера, чтобы увидеть результаты теста! Вот ссылка, которую вы можете найти _.invoke в testcase1a() и testcase1b() :

https://codepen.io/jhack_jos/pen/ExNVbWp

Как разрешается приведенное выше выражение?

  1. Если person значение не определено или person не имеет вызываемого метода getFullName , выражение _.invoke(person, "getFullName", "-"); разрешается следующим образом:
     //STEP 1
    const fullName = _.invoke(person, "getFullName", "-");

    //STEP 2
    const fullName = undefined;
  
  1. if person определен и имеет getFullName метод:
     //STEP 1
    const fullName = _.invoke(person, "getFullName", "-");

    //STEP 2
    const fullName = person.getFullName("-");

    //STEP 3
    const fullName = "surname-firstname";
  

Предупреждение

Если person у него есть свойство, которое не является вызываемым методом getFullName , вы получите ошибку времени выполнения!!