<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های فاطمه فضلی</title>
        <link>https://virgool.io/feed/@fatemefazli</link>
        <description>توسعه دهنده ی سمت کاربر</description>
        <language>fa</language>
        <pubDate>2026-06-07 16:31:17</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/15484/avatar/XHTUGH.png?height=120&amp;width=120</url>
            <title>فاطمه فضلی</title>
            <link>https://virgool.io/@fatemefazli</link>
        </image>

                    <item>
                <title>چالش های مهاجرت من - ۱</title>
                <link>https://virgool.io/@fatemefazli/%DA%86%D8%A7%D9%84%D8%B4-%D9%87%D8%A7%DB%8C-%D9%85%D9%87%D8%A7%D8%AC%D8%B1%D8%AA-%D9%85%D9%86-%DB%B1-vsndjul5buno</link>
                <description>مهاجرت مسیریه که این روزا خیلیامون توشیم یا بهش فکرمیکنیم اتفاقی که حدود ۲ ماه پیش برای من افتاد و هنوز با وجود این که هر روز این سوالو از خودم میپرسم که ارزششو داشت یا نه نمیتونم پاسخ دقیقی بهش بدم و البته خودمو مجبور هم نمیکنم که به این زودی بهش جواب بدم.اما خب فکر کردم اگه تصمیمتون رو گرفتین و میخواین مهاجرت کنین یا به تازگی مهاجرت کردین شاید دونستن چالش هایی که من این مدت داشتم و حس اینکه تو تجربه کردن اینها تنها نیستید یک مقداری کمک کننده باشه و البته نوشتن اینها برای خودم!امید دارم بتونم نوشته ها رو ادامه بدم چرا که زندگی در گذاره و هر بار با چالش های جدیدی رو به رومون میکنه.۱. ناشناختگی و اضطرابشاید اولین و بزرگترین حسی که باهاش روبه رو شدم حس ناشناختگی و در ادامه اضطراب ناشی ازون بود مواجه شدن با شرایط جدید، زندگی جدید، محیط جدید، شهر جدید، آدمای جدید، زبان جدید، کار جدید، سرگرمی های جدید، خوراکی های جدید، دوستای جدید و آب و هوای جدید و غذاهای جدید یه عالمه چیز جدید دیگه که با وجود خوب بودن هیچکدوم حس آشنا و شناخته شده ای بهم نمیداد. بلد نبودن و ندونستن و ترس مواجه شدن باهاشون و حس اینکه وای چقدر چیزهست که من نمیدونم و بلد نیستم و وقت کافی برای یاد گرفتنشون ندارم و الان ممکنه برام مشکل پیش بیاد باعث میشد دلم بخواد تمام روز زیر لاهافم قایم شم.۲. دلتنگی و احساس ناامنیبعد از اومدن هنوز خاطرات و همه ی آدمایی که ازشون کیلومتر ها دور شدیم با جزییات زیادی توی ذهنمون هستن، ذهنمون دوس داره مدام بهشون فکر کنه به لحظه هایی که کنارشون خوشحال بودیم و احساس امنیت میکردیم (این حس امنیت خیلی مهمه)، روزای اول برام اینطوری بود که بنظر اومدم مسافرت و بعد از چن روز وسایلمو جم میکنم و برمیگردیم و دوباره صب تو خونه ی خودمون و اتاق خودم بیدار میشم ناخوداگاهم اینطوری فکر میکرد و هرباری که بهش یادآوری میکردم که هی تو قراره تا آخرعمرت دیگه برای زندگی برنگردی و اینجا بمونی ترس و اضطراب بیش اندازه ای میومد سراغم و برای لحظاتی دستام یخ میکردن و پنیک میکردم و کم کم آروم میشدم. روزای اول هرچیز آشنایی منو یاد خانواده و دوستام و تهران مینداخت باعث میشد یه غم بزرگی تا آخر شب روی قلبم بشینه. یه روزهایی مدام صدای پدرم رو میشنیدم که اسممو با لحن مخصوص به خودش صدا میزنه یا مدام سعی میکردم عکساشون رو نگاه کنم و چهره اشونو بخاطر بیارم که نکنه چیزی از ذهنم بره اما چرا باید سعی میکردم همه ی اینا رو با تمام جزییات بخاطر داشته باشم؟ شاید فکر میکردم تا وقتی تمام و کمال توی ذهنم دارمشون حداقل توی قلبم احساس امنیت بیشتری میکنم.۳. عدم احساس مفید بودن و کاهش اعتماد بنفسوقتی کنار خانواده یا دوستاتون هستین و کاری براشون میکنین یا حسی رو بهشون منتقل میکینن فیدبک هایی که برای ادامه بهشون نیاز دارین رو ازشون دریافت میکنین ازتون تشکر میکنن یا لبخند میزنن باعث خوشحالیشون میشین به حرفاشون گوش میدین و احساس میکنین دست کم برای عده ای مفید هستین چیزی که من رو اذیت میکرد این بود که احساس میکردم دیگه برای عده ای مفید نیستم دوستی از دیدن و بودنم خوشحال نمیشه بودن یا نبودنم برای کسی (به استثنا یک نفر) فرقی نمیکنه فیدبکی از اطرافم نمیگیرم و باعث خوشحالی کسی نمیشم حسی که بیشتر از همه خودم بهش نیاز داشتم و کمبودش احساس مفید نبودن بهم میداد و اهمیت خودم رو برای خودم کم میکرد.۴. ترس از ساختن ارتباط های تازهتصور کنین برای من شدیدا درون گرا که همیشه منتظر بودم بقیه باهام ارتباطی رو شروع  کنن چقدر ساختن ارتباط های تازه سخت بود وقتی مدام به این فکر میکردم که اصن چطور میتونم خود واقعیم رو نشون بدم چطور میتونم دوباره برای عده ای مهم باشم و منو به عنوان دوست قبول کنن چطور میتونم باعث خوشحالی کسی اینجا بشم و یا حتی الهام بخش باشم کوچکترین رفتار منفی یی باعث میشد فکر کنم کافی نیستم یا طرف مقابل از من خوشش نمیاد و برعکس کوچیکترین رفتار مثبتی حس خوشحالی و پیش رونده ی بزرگی رو بهم میداد. برای من که همیشه اندک حس ناکافی بودن میکردم چطور میتونستم اعتماد بنفس گفتن از خودم و علاقه هام رو داشته باشم و فکر کنم یک سری آدم جدید چیزی از من قرار هست توی حافظه هاشون بمونه و نتیجه این میشد که فکر میکردم چه اشکالی داشت اگر کنار دوستام میموندم و نیازی نداشتم که این مسیر سخت رو مثل دانش آموزی که از یه مدرسه ی دیگه وسط سال منتقل میشه دوباره طی کنم.موارد بالا شاید بزرگترین چالش هایی بود که از ابتدای مهاجرتم بهشون برخوردم یه بخشیشون تا امروز بعد از تقریبا ۲ ماه حل شده یه بخشیشون هنوز هست اما مهم ترین چیزی که این مدت یاد گرفتم و تونستم بخاطرش ادامه بدم یادآوری این جمله بود که شرایط همیشه همونطوری که هستن باقی نمیمونن قرار نیست احساسی که الان داریم تا ابد همراهمون بمونه قرار نیست هیچوقت نتونیم از پسشون بربیایم و نتونیم چیزی رو عوض یا بهتر کنیم و البته یادآوری اینکه بخاطر چه چیزهایی تصمیم گرفتیم مهاجرت کنیم.</description>
                <category>فاطمه فضلی</category>
                <author>فاطمه فضلی</author>
                <pubDate>Fri, 12 Nov 2021 21:12:56 +0330</pubDate>
            </item>
                    <item>
                <title>تازه های تایپ اسکریپت ۳</title>
                <link>https://virgool.io/JavaScript8/typescript-3-0-what-is-new-t33osbuyvend</link>
                <description>بعد از ۲ سال از انتشار تایپ اسکریپت ۲ و محبوب شدنش اخیرا مایکروسافت تایپ اسکریپت ۳ رو منتشر کرده که توی این مطلب می خوایم ببینیم چه چیزای جدیدی نسبت به نسخه های قبل بهش اضافه شده و چه تاثیری میتونه روی دولوپ کردن ما داشته باشه. تایپ های tuple قوی ترتاپل ها توی تایپ اسکریپت در واقع همون strongly-typed آرایه های توی جاوا اسکریپت با طول ثابت هستن و اینطوری ازشون استفاده می شد:type Triple = [boolean, number, string];
const a: Triple = [true,1,&#039;lia&#039;];توی تایپ اسکریپت ۳ میتونیم tuple ها رو با طول تعریف نشده بزاریم و فقط بهش یه مقدار حداقل بدیم. به عنوان مثال:type StringAndNumbers = [string, ...number[ ]];
const a1: StringAndNumbers = [&#039;lia&#039;,0 , 1, 2, 3];
const a2: StringAndNumbers = [&#039;lia&#039;];همون طور که میبینیم قسمت اول یه string عه که خب حتما باید داشته باشیمش اما قسمت دوم که اعداد هستن میتونن حذف بشن. ما حتی میتونیم tuple هایی داشته باشیم که اون قسمت اول و لازم و حداقل رو هم ندارن یعنی یه چیزی مثل مثال بالا با این تفاوت که نیازی نیست حتما اون آیتم string رو توی تاپلمون داشته باشیم که این میشه همون یه آرایه یا یه tuple خالی، به مثال توجه کنید:type Strings = [...string];
type Empty = [ ];
const b1: Strings = [&#039;lia&#039;, &#039;liaa&#039;];
const b2: Strings = [ ];
const b3: Empty = [ ];
const b4: Empty = [&#039;lia&#039;, &#039;liaa&#039;]; // تایپ اشتباه و غیرقابل قبولتاپل ها میتونن استفاده های مفیدی داشته باشن برای مثال میتونیم یه آرایه رو مجبور کنیم که حداقل یه المنت تو خودش داشته باشه!انتشار و جدا کردن Argument های تابع با استفاده از همین tuple type هاهمونطور که میدونین توی جاوا اسکریپت ما میتونیم از argument های تابع استفاده کنیم بدون اینکه هیچ کدومو نام گذاری کرده باشیم ولی تایپ اسکریپت به صورت دیفالت این اجازه رو به ما نمیده و تک تک چیزها رو برای استفاده باید از قبل به کامپایلر بشناسونیم:// JavaScriptfunction 
jsHello() { 
    return [...arguments].join(&#039;,&#039;);
} 
// JavaScript, second way
function jsHello1(...args) { 
    return args.join(&#039;,&#039;);
} 
// TypeScript
function tsHello(...args: any[]): string { 
    return args.join(&#039;,&#039;);
}یه زمانی هست که خب ما نمی خایم از any استفاده کنیم برای argument های تابعمون مثلن میخایم بگیم که argument امون number باشه یا string که خب به راحتی میتونیم بنویسم (string | number) اما یک زمانی هم هست که ما یه دیتایی داریم متشکل از یه سری number و یه سری string و خب مشخص هم نیست که اینا چند تا هستن و یا به ترتیب نوعشون چیه پس نمیتونیم argument تابعمون رو به صورت ( string | number ) هم تعریف کنیم. توی تایپ اسکریپت ۳ این مشکل به کمک همین tuple ها به راحتی حل میشه:function hello(...args: [string, number, number, ...string[ ]]): string { 
    return args.join(&#039;,&#039;);
}یه مثال متفاوت تر :function compose2&lt;T1 extends any[], T1R, T2&gt;(f1: (...args1: T1) =&gt; T1R,  f2: (arg: T1R) =&gt; T2) { 
     return (...a: T1) =&gt; f2(f1(...a));
 } 
 const add = (x: number, y: number) =&gt; x + y;
 const sqr = (x: number) =&gt; x * x;
 const addAndSqr = compose2(add, sqr); 
 addAndSqr(1, 2); // valid
 addAndSqr(&#039;a&#039;, 2); // invalid typeآیتم های اختیاری در tuple typesدر ورژن جدید tuple type ها مجاز هستند از کاراکتر &quot;?&quot; برای آیتم های اختیاری استفاده کنند:let t: [number, string?, boolean?]; 
t = [42, &quot;hello&quot;, true]; 
t = [42, &quot;hello&quot;]; 
t = [42];ناشناخته : &quot;unknown&quot;تایپ اسکریپت یه تایپ any داره که تقریبا به معنای هر تایپیه و همه چیزو میتونه هندل کنه ولی پرکتیک خوبی نیست که بخوایم ازش به دفعات زیاد استفاده کنیم . یه بار هست که ما از any استفاده می کنیم زمانی که نمیدونیم واقعا چی داریم ولی بعدن قراره بفهمیم و تایپشو دقیق تر کنیم و در واقع به صورت strongly typed ازش استفاده کنیم. وقتی از any استفاده می کنیم حتی لازم نیست بعدا تایپ متغیرمون رو چک کنیم و به راحتی بدون هیچ ارور کامپایلی میتونیم ازش استفاده کنیم. توی تایپ اسکریت ۳ یه تایپ جدید به اسم unknown اضافه شده که به کامپایلر میگه &quot;ما واقعا نمیدونیم در حال حاضر چی داریم پس تا زمانی که نفهمیدیم چی داریم نمیتونیم ازش استفاده کنیم.&quot;  مثال رو نگاه کنید تا بهتر متوجه بشین:const a1: any = &#039;lia&#039;;
const a2: unknown = &#039;lia&#039;;
a1.length; // = 1
a2.length; // compiler error
a1(); // error during execution
a2(); // compiler error
new a1(); // error during execution
new a2(); // compiler error
const a3 = a1 + 3; // = &#039;lia3&#039;
const a4 = a2 + 3; // compiler error

const b: unknown = { a: &#039;b&#039; };
console.log(b.a); // compiler error
function hasA(obj: any): obj is { a: any } {
    return !!obj
        &amp;&amp; typeof obj === &#039;object&#039;
        &amp;&amp; &#039;lia&#039; in obj;
}
if (hasA(b)) {
    console.log(b.a); // = &#039;b&#039;
}

// unknown in conditional types 
type T30&lt;T&gt; = unknown extends T ? true : false;  // Deferred 
type T31&lt;T&gt; = T extends unknown ? true : false;  // Deferred (so it distributes) 
type T32&lt;T&gt; = never extends T ? true : false;  // true 
type T33&lt;T&gt; = T extends never ? true : false;  // Deferred 

// keyof unknown 
type T40 = keyof any;  // string | number | symbol 
type T41 = keyof unknown;  // neverدقت کنین که این یه تغییر بزرگ تلقی میشه و از نسخه ی ۳ به بعد unknown جز کلمات کلیدی زبان میشه و دیگه نمیتونیم به عنوان اسم ازش استفاده کنیم!پشتیبانی از defaultProps در JSXتایپ اسکریپت ۲.۹ و قبل از اون نمیتونست توی اعلان defualtProps در کامپوننت های JSX نفوذ کنه و کاربرها مجبور بودن که ویژگی ها رو مشخص کنن و از تکرار های non-null داخل render استفاده کنن، یا ازtype-assertions برای مشخص کردن تایپ کامپوننت قبل از اکسپورت کردن اون استفاده کنن. از ویژگی های جدید تایپ اسکریپت ۳ پشتیبانی language-level از defaultProps عه ری اکت جی اس عه. برای اونایی که تا حالا چیزی از defaultProps نشنیدن باید بگم که به صورت معمول توی جاوا اسکریپت (ECMAScript 6) اگر ما می بخوایم پارامترهای مولفه پیش فرض React رو ارائه بدیم، می تونیم با استفاده از defaultProps object static مثل مثال پایین این کارو انجام بدیم:import * as React from &#039;react&#039;;
import * as ReactDOM from &#039;react-dom&#039;; 

class Heading extends React.Component { 
        render() { 
            return &lt;h1&gt;{this.props.title.toUpperCase()}&lt;/h1&gt;  
        }
} 
Heading.defaultProps = { title: &#039;Hello!&#039; };
const elem = document.querySelector(&#039;#target&#039;);
ReactDOM.render(&lt;Heading /&gt;, elem);همانطور که می بینیم، به لطف استفاده از defaultProps نیازی به انجام null check روی title نداریم، زیرا ما مطمئن هستیم که همیشه یه ارزش خاصی داره. در گذشته TypeScript نمی تونست این رو درک کنه و ما مجبور بودیم حتما یک null check انجام بدیم. در مثال های زیر نشون میدیم که چگونه می تونیم این موضوع رو در TypeScript 2.x هندل کنیم و چگونه می تونیم توی ورژن جدید انجامش بدیم:type Props = {  title?: string;}; 
class Heading extends React.Component&lt;Props&gt; { 
    static defaultProps = {   title: &#039;Hello!&#039;  };  
    render() { 
        const title = this.props.title; return &lt;h1&gt;{title &amp;&amp; title.toUpperCase()}&lt;/h1&gt; 
    }    
}type Props = {  title?: string;}; 
class Heading extends React.Component&lt;Props&gt; { 
    static defaultProps = {    title: &#039;Hello!&#039;  };  
    render() { 
        const title = this.props.title; return &lt;h1&gt;{title.toUpperCase()}&lt;/h1&gt;  
    }   
}همانطور که می بینید، در جدیدترین نسخه TypeScript نیازی به بررسی null نیست، زیرا کامپایلر می تونه مقدار پارامتر تعریف شده در defaultProps رو ببینه!مراجع پروژه(Project references)این ویژگی احتمالن مهم ترین ویژگی تایپ اسکریپت ۳ باشه، ما ازین به بعد قادر خواهیم بود که  cross‑project references تعریف کنیم. Project references به پروژه TypeScript اجازه می ده که به سایر پروژه های TypeScript وابسته باشه - به طور خاص، اجازه می ده فایل tsconfig.json به سایر فایل های tsconfig.json مراجعه کنه. مشخص کردن این وابستگی ها باعث می شه که کد شما به پروژه های کوچکتر تقسیم بشه، زیرا TypeScript (و ابزارهای اطراف اون) راهی برای درک ترتیب build و ساختار خروجی هستش.به لطف این تغییر، ما میتونیم از برخی از سناریوهای معماری جدید پروژه مانند:استفاده از کدهای مشترک برای سمت کاربر(کلاینت) و سمت سرور. خروجی کامپایل شده کد رو هم شیر میکنه نه اینکه یه کپی جدا از هر فایل کد داشته باشه.یونیت تست ها شامل کپی خود از فایل های اصلی پروژه نیستن.بسیاری از پروژه های وابسته به یکدیگر(MonoRepos). همراه با راه حل های تست مثل Lerna و Yarn Workspaces.استفاده کنیم. همه ی این ها به لطف ورودی های جدید توی tsconfig امکان پذیر میشه: فلگ composite برای گزینه های کامپایلر و references. همچنین ما یک پارامتر جدید برای tsc (کامپایلر TypeScript) داریم: - - build که می تونه تمام پروژه های TypeScript را با توجه به tsconfig داده شده بسازه.برای نمونه فرض کنیم که یه همچنین ساختاری برای پروژه داریم:در پروژه کلاینت tsconfig.json، می شه از دستور زیر برای بیلد گرفتن استفاده کرد:tsc -b composite / clientبرای استفاده از shared project ما به راحتی چیزهایی از آن رو که نیاز داریم بدون هیچ ساختار اضافی در کد وارد می کنیم:{
    &quot;compilerOptions&quot;: { 
        &quot;target&quot;: &quot;es5&quot;, 
        &quot;module&quot;: &quot;commonjs&quot;, 
        &quot;lib&quot;: [&quot;es2015&quot;, &quot;dom&quot;], 
        &quot;outDir&quot;: &quot;../../lib/client&quot;, 
        &quot;composite&quot;: true, 
        &quot;strict&quot;: true, 
        &quot;esModuleInterop&quot;: true, 
    }, 
    &quot;references&quot;: [ 
        { &quot;path&quot;: &quot;../shared&quot; }  
    ]
}بعد از کامپایل کردن هر دوی پروژه های کلاینت و سرور ما به همچین ساختاری می رسیم:همینطور که می بینید دایرکتوری shared در واقع بین کلاینت و سرور تقسیم شده. در نسخه های قدیمی تر، دایرکتوری &quot;shared&quot; را به هر دو client و server کپی می کردیم، بنابراین ساختار خروجی متفاوت از ساختار منبع ایجاد می شه. این تغییر در واقع بزرگترین تغییر ورژن جدید تایپ اسکریپت هست با این وجود باید ببینیم که توی پروژه های جدید و ساختار های متفاوت چطوری قراره ازین ویژگی استفاده بشه.خب توی نسخه ی ۳ بنظر میاد این زبان جذاب در حال هر روز بهتر شدنه و من خودم به شخصه واقعا از استفادش لذت میبرم:‌ Love for TypeScript</description>
                <category>فاطمه فضلی</category>
                <author>فاطمه فضلی</author>
                <pubDate>Fri, 28 Sep 2018 17:05:15 +0330</pubDate>
            </item>
            </channel>
</rss>