# اعتبارسنجی عمومی را با توابع قابل استفاده مجدد جایگزین کنید

توسعه دهندگان جاوا اسکریپت و تایپ اسکریپت اغلب شرایط مشابهی را به طور مکرر می نویسند. اگر شما یک توسعه دهنده وب هستید، احتمالاً با کدهایی مانند زیر مواجه شده اید:
const handleSaveTextKeydown = (event: KeyboardEvent) => {
if (event.key === 'Enter') {
//... save text
}
}
در این مورد، event.key
از نوع است string
و معرفی اشکالات با قرار دادن تصادفی فاصله در آن آسان است 'Enter '
به عنوان مثال
چرا این شرایط را در یک تابع کپسوله نمی کنیم؟
const handleSaveTextKeydown = (event: KeyboardEvent) => {
if (checkIsEnterKey(event.key)) {
//... save text
}
}
این تضمین می کند که تمام بررسی های کلید Enter سازگار و قابل اعتماد هستند.
حال، این اعتبارسنجی را در نظر بگیرید:
type Value = null | object;
const value = {} as Value;
if (typeof value === 'object') {
value; // value type is null | object
}
حتی اگر TypeScript هوشمند است، value
در داخل شرایط از نوع باقی می ماند Value
. این به این دلیل است typeof null
برمی گرداند 'object'
.
بنابراین، باید بنویسید:
if (value !== null && typeof value === 'object') {
value; // value type is object
}
بسیاری از توسعه دهندگان ممکن است این را در یک تابع کپسوله نکنند و در عوض هر زمان که با این وضعیت مواجه شدند آن را مکررا بنویسند.
چند بار در زندگی خود همین شرط را نوشته اید؟
چند بار همین اشتباه را کرده اید؟
در آینده چند بار دیگر همین شرط را می نویسید؟
اگر من بودم این کار را می کردم:
if (checkIsObject(value)) {
value; // value type is object
}
محصور کردن شرایط عمومی در توابع مزایای زیادی دارد.
به مثال زیر توجه کنید:
const array = [0, 1, 2, 3, 4, 5, null, undefined];
بیایید یک آرایه ایجاد کنیم که فقط مقادیر تهی را حذف کند.
ممکن است مختصر بودن را در اولویت قرار دهید و آن را به این صورت بنویسید:
const numbers = array.filter(Boolean);
متأسفانه، این ایده آل نیست. 0
نیز به عنوان ارزیابی می شود false
و حذف می شود پس باید بنویسید:
const numbers = array.filter(item => item !== null && item !== undefined);
آیا این کد زشت و غیرقابل استفاده مجدد به نظر نمی رسد؟
من می توانم کد ظریف تری بنویسم:
const numbers = array.filter(checkIsNullish);
نوشتن مکرر شرایط عمومی را متوقف کنید. این فقط منجر به اشتباه می شود و کد کمتر قابل خواندن می شود.
اجازه دهید کتابخانه ای را که من ایجاد کردم به نام چکر معرفی کنم.
این کتابخانه تابع ابزار، شرایط رایج مورد استفاده در توسعه عمومی وب و توسعه سطح پایین را به عنوان توابع نشان می دهد. همه توابع یک ورودی می گیرند و یک مقدار بولی برمی گردانند.
در زمان نگارش این مقاله، توابع زیادی برای مدیریت انواع دادهها مانند رشتهها، اعداد، بولی ها و مقادیر تهی ارائه میشود. همه توابع آزمایش شده، مستند شده و شروع به استفاده آسان است.
بیایید به چند نمونه از دنیای واقعی نگاه کنیم.
بسته های ارائه شده توسط این کتابخانه همگی در JSR منتشر شده اند. آنها را می توان به راحتی در پروژه های NPM، PNPM، Yarn، Bun و Deno نصب کرد.
در اینجا، ما را می گیریم @checker/string
بسته به عنوان نمونه با NPM.
- بسته را نصب کنید
دستور زیر را در پوشه پروژه خود اجرا کنید:
npx jsr add @checker/string
- با استفاده از توابع
import { checkIsNotEmptyString, checkIsIndexFound } from "@checker/string";
const value = "Hello";
const formatted = value.trim();
if (checkIsNotEmptyString(formatted)) {
// formatted !== ''
// When formatted is not an empty string
}
const index = value.indexOf("el");
if (checkIsIndexFound(index)) {
// index !== -1
// When "el" is found in value
}
من علاقه ای به استفاده از عملگرهای نفی منطقی مانند آن ندارم !SOME_CONDITION
برای معکوس کردن یک مقدار بولی این به این دلیل است که ضمنی است و صرفاً معکوس کردن مقدار بولی با افزودن یا حذف آن میتواند به بسیاری از موقعیتهای خطرناک منجر شود.
بنابراین، همه توابع متناظر هستند checkIsNot~
توابع تعریف شده
شرایط عمومی را در توابع کپسوله کنید. به این ترتیب، کد خواناتر می شود و باگ ها راحت تر شناسایی می شوند.
ممنون که خواندید.