#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 ?
в виду, что это может быть более чистым с помощью функции типа _.IfNotNull3. Нет, он имеет в виду
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
Как разрешается приведенное выше выражение?
- Если
person
значение не определено илиperson
не имеет вызываемого методаgetFullName
, выражение_.invoke(person, "getFullName", "-");
разрешается следующим образом:
//STEP 1
const fullName = _.invoke(person, "getFullName", "-");
//STEP 2
const fullName = undefined;
- if
person
определен и имеетgetFullName
метод:
//STEP 1
const fullName = _.invoke(person, "getFullName", "-");
//STEP 2
const fullName = person.getFullName("-");
//STEP 3
const fullName = "surname-firstname";
Предупреждение
Если person
у него есть свойство, которое не является вызываемым методом getFullName
, вы получите ошибку времени выполнения!!