til :オブジェクトからの破壊
11866 ワード
定義されていない値から削除する
問題
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
). 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
値は無視されます.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
- オブジェクトまたは未定義の値にスプレッド演算子を使用します.追加リンク
キープタッチ
私の社会的メディアを通して私に連絡してください.DDD、TDD、良い実行と新しいワンダーウーマン1982映画について話しましょうGitHub .
あなたが今日学んだことを教えてください.
Reference
この問題について(til :オブジェクトからの破壊), 我々は、より多くの情報をここで見つけました https://dev.to/stevescruz/til-destructuring-from-object-undefined-1colテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol