Разрушение объекта TypeScript - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь разделить объект на другой объект, я имею в виду перенести подмножество свойств из Объекта А в Объект Б. Я делаю это так:

  const User = new UserImpl();
        User.email = user.email;
        User.name = user.name;
        User.family_name = user.familyName;
        User.password = 'Test!';
        User.verify_email = true;
        User.email_verified = false;
        User.blocked = false;
  const {
            email,
            name,
            family_name,
            password,
            verify_email,
            email_verified,
            blocked,
            connection
        } = User;
  const res_user = {
            email,
            name,
            family_name,
            password,
            verify_email,
            email_verified,
            blocked,
            connection
        };
        return res_user;

но есть ли способ сделать это с помощью Object.assign ()? или использовать функцию arrow => вместо двух переменных или сделать это в два шага?

Спасибо

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

Если бы я копировал список свойств, я бы, вероятно, определил бы функцию a pick(), используя Pick тип :

const pick = <T, K extends keyof T>(obj: T, ...keys: K[]) =>
  keys.reduce((acc, k) => ((acc[k] = obj[k]), acc), {} as Pick<T, K>);

А затем предполагая, что у вас естьследующий интерфейс и объект

interface User {
  email: string;
  name: string;
  familyName: string;
  password: string;
  verifyEmail: boolean;
  emailVerfified: boolean;
  blocked: boolean;
}

const u: User = {
  email: "luser@example.com",
  name: "Larry",
  familyName: "User",
  password: "th3b1gg3stLUSER",
  verifyEmail: true,
  emailVerfified: false,
  blocked: false
};

console.log(u); // everything

Вы можете скопировать только свойства, которые вас интересуют, в новый объект, подобный этому:

const v = pick(u, "name", "familyName", "email");
// const v: Pick<User, "name" | "familyName" | "email">
// const v: {name: string, familyName: string, email: string}

console.log(v); // just name, familyName, email
// {name: "Larry", familyName: "User", email: "luser@example.com"}

Надеюсь, это поможет;удачи!

Ссылка на код

2 голосов
/ 21 июня 2019

Если есть только несколько свойств, которые вы хотите скопировать, вы всегда можете избавиться от деструктуризации и просто сделать:

  const res_user = {
    email: User.email,
    name: User.name,
    family_name: User.family_name,
    password: User.password,
    verify_email: User.verify_email,
    email_verified: User.email_verified,
    blocked: User.blocked,
    connection: User.connection,
  };
  return res_user;

Этот код короче, чем деструктурирование объекта User, чтобы реструктурировать его позже.

В качестве альтернативы, если есть только несколько свойств, которые вы хотите удалить (и, если вы знаете, что других свойств нет), вы можете использовать параметр rest / spread :

const {
   some_prop_i_dont_care_about,
   some_other_prop,
   ...res_user
} = User;
return res_user;

Это создаст новый объект, содержащий все свойства , за исключением , перечисленных выше, и назначит этот объект переменной res_user.

...