Правильный способ сопоставления шаблонов записей ReasonML

У меня есть тип записи, который идет,

type person = {
 name: string,
 gender: string,
 age: int
}

и иметь множество записей, соответствующих этому типу. Что я хочу сделать, так это извлечь только [имя, возраст] из человека и сделать новую запись. Для этого я сначала подумал об использовании метода сопоставления с образцом, который выглядит так:

switch(input) {
  |({name, _, gender} => //make a new record by extracting only name and age
  |_ => ();
}

Есть ли смысл в этом подходе? Если да, то как мне поступить? Если нет, то каким будет правильный способ удаления ключа из записи (записи неизменяемы, поэтому это не имеет смысла) или извлечения другой записи из существующей?


person Sanghyun Kim    schedule 22.10.2020    source источник


Ответы (1)


На самом деле вам не нужно переключаться на сопоставление с образцом.

По сути, достаточно просто использовать let {name, gender, age: _} = input, чтобы извлечь два нужных атрибута.

Вы можете сделать вспомогательную функцию следующим образом:

type person = {
  name: string,
  gender: string,
  age: int,
};

type nameAndGender = {
  name: string,
  gender: string,
};

let personToNameAndGender = (person) => {
  let {name, gender, age: _} = person;
  {name, gender};
};

Имейте в виду, что вам необходимо заранее определить оба типа записей.

ПРИМЕЧАНИЕ. Вы также можете опустить возраст, если вы просто совпадаете с частичной записью.

let {name, gender}: person = person;

но тогда вам нужно аннотировать его, поскольку система типов не может автоматически определить, какая из двух записей это.

Here is a working example.

person BackfromHell    schedule 22.10.2020