spinny:~/writing $ vim advanced-typescript-patterns.md
1~2TypeScript به استاندارد صنعتی برای توسعه وب در مقیاس بزرگ تبدیل شده است. در حالی که بیشتر توسعهدهندگان اصول اولیه اینترفیسها و تایپها را میدانند، قدرت واقعی در سیستم تایپ پیشرفته آن نهفته است. در اینجا ۵ الگو وجود دارد که شما را به عنوان یک مهندس ارشد متمایز میکند.3~4## ۱. Generic Constraints5~6Genericها قدرتمند هستند، اما گاهی اوقات باید آنچه را که میتواند ارسال شود محدود کنید. `extends` دوست شما در اینجاست.7~8```typescript9interface HasId {10 id: string;11}12~13function getById<T extends HasId>(list: T[], id: string): T | undefined {14 return list.find((item) => item.id === id);15}16```17~18با اطمینان از اینکه `T` از `HasId` ارثبری میکند، تضمین میکنیم که دسترسی به `.id` در داخل تابع ایمن است.19~20## ۲. Conditional Types21~22Conditional Types به شما امکان ایجاد نگاشتهای نوع غیر یکنواخت را میدهند. نحو آن مشابه عملگر سهگانه در JavaScript است.23~24```typescript25type IsString<T> = T extends string ? true : false;26~27type A = IsString<string>; // true28type B = IsString<number>; // false29```30~31یک مورد استفاده عملی فیلتر کردن تایپها از یک union است:32~33```typescript34type Diff<T, U> = T extends U ? never : T;35type NonNullable<T> = Diff<T, null | undefined>;36```37~38## ۳. Mapped Types39~40Mapped Types به شما امکان ایجاد تایپهای جدید بر اساس تایپهای قدیمی با تبدیل ویژگیها را میدهند.41~42```typescript43type ReadOnly<T> = {44 readonly [P in keyof T]: T[P];45};46~47interface User {48 name: string;49 age: number;50}51~52type ReadOnlyUser = ReadOnly<User>;53```54~55حتی میتوانید تغییردهندهها را اضافه یا حذف کنید:56~57```typescript58type Mutable<T> = {59 -readonly [P in keyof T]: T[P];60};61```62~63## ۴. Template Literal Types64~65معرفی شده در TypeScript 4.1، اینها به شما امکان دستکاری مستقیم تایپهای رشتهای را میدهند.66~67```typescript68type World = 'world';69type Greeting = `hello ${World}`; // "hello world"70~71type Color = 'red' | 'blue';72type Quantity = 'light' | 'dark';73~74type Palette = `${Quantity}-${Color}`;75// "light-red" | "light-blue" | "dark-red" | "dark-blue"76```77~78این برای تایپ کردن رشتههایی که از الگوی خاصی پیروی میکنند، مانند کلاسهای CSS یا نام رویدادها، بسیار مفید است.79~80## ۵. کلمه کلیدی `infer`81~82کلمه کلیدی `infer` در Conditional Types به شما امکان استخراج تایپها از تایپهای دیگر را میدهد.83~84```typescript85type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;86~87function check(): boolean {88 return true;89}90~91type CheckReturn = ReturnType<typeof check>; // boolean92```93~94در اینجا، ما از TypeScript میخواهیم که نوع بازگشتی `R` یک تابع را "استنباط" کند و آن را برگرداند.95~96## نتیجهگیری97~98تسلط بر این الگوها به شما امکان نوشتن کتابخانهها و ابزارهایی را میدهد که مستحکم هستند و تجربه توسعهدهنده (DX) عالی ارائه میدهند. هدف TypeScript پیشرفته پیچیدگی به خاطر پیچیدگی نیست، بلکه ایمنی و بیانگری است.99~
NORMAL · advanced-typescript-patterns.md [readonly]99 lines · :q to close