til :オブジェクトからの破壊



定義されていない値から削除する

問題
The updateUserProfile 関数は、user 提供してデータベースにクエリを作成することでuser_id , 次に、別のデータベースクエリを使用して、email は別のユーザに属していなくて、最終的にデータベースでユーザを更新しますname and email .
問題は、我々がすでに提供されたユーザを持っているかどうかをチェックするときだったemail データベースの結果はUser オブジェクトundefined , 我々がユーザーを見つけたかどうかによって異なります.
The User objectには多くのプロパティがあります(id , name , email , avatar , password , created_at , updated_at ), しかし、私はid 指定したプロパティと比較するプロパティ.user_id メールがすべてのユーザーに属していないことを保証します.
私は、唯一のunpackに破壊を使用することができませんでしたid 結果から、findEmailOwner その結果はUser オブジェクトundefined , そこで以下のようなエラーメッセージを受け取りました."Property 'id' does not exist on type 'User | undefined' .
TLDR:私は得る必要がありますid 値を破壊することによってobject or undefined .
function updateUserProfile ({ user_id, name, email }) {
  const user = await usersRepository.findById(user_id);

  if (!user) {
    throw new AppError(`The user was not found.`, 401);
  }

  const { id: findEmailOwner } = await usersRepository.findByEmail(email); // error message: "Property 'id' does not exist on type 'User | undefined'.

  if (typeof findEmailOwner !== 'undefined' && findEmailOwner !== user_id) {
    throw new AppError(`This email cannot be used.`, 401);
  }

  user.name = name;  
  user.email = email;

  return usersRepository.save(user);
}

アンサー
  • 私たちは、デフォルトの回路を評価するためにデフォルトのuser 虚偽値undefined , null , 0 , -0 , 0n , "" or NaN ).
  • 注1:私はこのアプローチをアプリケーションで使用することができますid 私が破壊することで取得したいプロパティは、データベース内の任意の値に割り当てられません.
    注2 :しかし、私がavatar 割り当てることができるプロパティnull データベースでは、このアプローチは動作しません.
    ```tsx
    // Case 1 - id (cannot contain falsy values)
    
    // user does not exist
    const user = undefined
    const { id } = user || {}
    console.log(id) // undefined (what we expect)
    
    // user exists
    const user = {
        id: 'aaaa-aaaa-aaaa-aaaa',
    };
    const { id } = user || {}
    console.log(id) // 'aaaa-aaaa-aaaa-aaaa' (what we expect)
    
    // Result: SUCCESS
    
    //-----------------------------------------
    
    // Case 2 - avatar (can contain null a falsy values)
    
    const user = undefined
    const { avatar } = user || {}
    console.log(avatar) // undefined (what we expect)
    
    const user = {
        avatar: 'photo.jpg',
    };
    const { avatar } = user || {}
    console.log(avatar) // 'photo.jpg' (what we expect)
    
    const user = {
        avatar: null,
    };
    const { avatar } = user || {}
    console.log(avatar) // undefined (not good, we needed this to be null)
    
    // Result: FAILURE
    ```
    
  • もう一つのアプローチはuser オブジェクトを破壊する前にnull and undefined 値は無視されます.
  • 注1 :このアプローチを使用して、avatar Falsy値に割り当てることができるプロパティnull ) データベースでは、最初のアプローチは動作しません.
    注2:このアプローチは、より慣用的ではないので、私は最初のアプローチが動作する場合のためにそれを使用しないでしょう.
    注3 :このアプローチはまたid .
    //Case - avatar (can contain null a falsy values)
    
    const user = undefined
    const { avatar } = { ...user }
    console.log(avatar) //undefined (what we expect)
    
    const user = {
      avatar: 'picture.jpg',
    }
    const { avatar } = { ...user }
    console.log(avatar) // 'picture.jpg' (what we expect)
    
    const user = {
      avatar: null,
    }
    const { avatar } = { ...user }
    console.log(avatar) // null (what we expect)
    
    // Result: SUCCESS
    
    短絡評価手法のコードへの適用
    function updateUserProfile ({ user_id, name, email }) {
      const user = await usersRepository.findById(user_id);
      if (!user) {
        throw new AppError(`The user was not found.`, 401);
      }
      const { id: findEmailOwner } = (await usersRepository.findByEmail(email)) || {}; // 1st approach
      if (typeof findEmailOwner !== 'undefined' && findEmailOwner !== user_id) {
        throw new AppError(`This email cannot be used.`, 401);
      }
      user.name = name;
      user.email = email;
      return usersRepository.save(user);
    }
    

    TLR
  • ある値から破壊することによってプロパティを取得することobject or undefined - 短絡の評価を使用します.
  • ある値から破壊することでプロパティを取得することobject or undefined - オブジェクトまたは未定義の値にスプレッド演算子を使用します.

  • 追加リンク
  • JS/ES6: Destructuring of undefined on Stack Overflow

  • キープタッチ
    私の社会的メディアを通して私に連絡してください.DDD、TDD、良い実行と新しいワンダーウーマン1982映画について話しましょうGitHub .
    あなたが今日学んだことを教えてください.