برنامه نویسی

Vue 3.3: انواع عمومی و زمان استفاده از آنها

پنج روز پیش، Vue نسخه 3.3 “Rurouni Kenshi” به طور رسمی منتشر شد و دارای ویژگی های شگفت انگیز است. تقویت DX و کار با Typescript. در این پست قصد داریم برخی از ویژگی های جدید جالب و نحوه جدید را بررسی کنیم انواع ژنریک ویژگی می تواند به شما کمک کند اجزای ایمن بهتر بسازید.

انواع ژنریک چیست؟

می‌توانید از Generic Types استفاده کنید تا بررسی کنید که آیا دو یا چند props ارسال شده به یک جزء واقعاً دارای همان نوع هستند یا خیر. این ممکن است در هنگام ساختن یک مؤلفه Select مورد نیاز باشد، همانطور که در مثال زیر از پست وبلاگ رسمی ایوان یو نشان داده شده است:

<script setup lang="ts" generic="T">
defineProps<{
  items: T[]
  selected: T
}>()
</script>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این به این معنی است که هنگام ارائه یک ورودی برای ویژگی اقلام نوع array<string> شما باید یک مقدار از نوع را ارائه دهید string در غیر این صورت Typescript سر شما فریاد می زد.


اما واقعا چه زمانی به این نیاز دارم؟!

مثال بالا ممکن است کمی انتزاعی به نظر برسد، بنابراین بیایید به یک سناریوی “دنیای واقعی” نگاه کنیم که در آن واقعاً می تواند مفید باشد.

ما یک برنامه کاربردی را فرض می کنیم که در آن داده ها را با مدل های مختلف از سرور به عنوان مثال کاربران و نقش ها واکشی می کنیم. ممکن است بخواهیم از یک مؤلفه Select استفاده کنیم که با هر دو نوع داده کار می کند. معمولاً یک کتابخانه کامپوننت Headless مانند Headless UI نیز اضافه می کنم.

انواع عمومی در عمل

برای تنظیم یک نسخه ی نمایشی سریع اجرا می کنیم:

npx create-vite@latest vue-demo --template vue-ts
cd vue-demo
npm install
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای راه اندازی Headless UI: npm install @headlessui/vue

جزء Select

ما می توانیم یک مؤلفه انتخابی ایجاد کنیم که از نوع عمومی T استفاده می کند که یک شی از نوع را گسترش می دهد OptionProps = {id: string | number, name: string}، به شرح زیر است:

<script setup lang="ts" generic="T extends OptionProps">
import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel, } from "@headlessui/vue";
import { computed } from "vue";

// define and export Option props
export type OptionProps = {
  id: string | number;
  name: string;
};

// define props by using generic
const props = defineProps<{
  options: T[];
  modelValue: T;
}>();

// define emits
const emit = defineEmits<{
  "update:modelValue": [value: T];
}>();

// define proxyValue for modelValue to emit update:modelValue
const proxy = computed({
  get() {
    return props.modelValue;
  },
  set(value: T) {
    emit("update:modelValue", value);
  },
});
</script>
<template>
  <Listbox as="div" v-model="proxy">
    <ListboxLabel> Select an option </ListboxLabel>
    <ListboxButton> {{ proxy.name }}  </ListboxButton>
    <ListboxOptions>
      <ListboxOption v-for="option in options" :key="option.id" :value="option">
        {{ option.name }}
      </ListboxOption>
    </ListboxOptions>
  </Listbox>
</template>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


حالا که ما خودمان را تعریف کردیم <MySelect /> جزء ما می توانیم شروع به استفاده از آن در جاهای دیگر. اینجاست که قدرت تایپ اسکریپت به میان می آید.

1. ما یک اشاره بسیار جذاب از نوع درون خطی توسط پسوند Volar داریم

این به وضوح یکی از محبوب ترین ویژگی های استفاده از Vue با Typscript است. هنگامی که برخی از قطعات بر روی یک جزء مورد نیاز است، Volar به صورت خطی اشاره خواهد کرد آنها را که باید شامل شوند.

اشاره نوع درون خطی


2. زمانی که ورودی ما نوع پایه مورد نیاز را برآورده نکند به ما اطلاع داده می شود

با استفاده از T عمومی، و تعریف لوازم مورد نیاز، می دانیم که چه زمانی برخی از لوازم ورودی ارائه شده را از دست می دهیم.

نوع مورد نیاز نیست


3. ما می توانیم واردات OptionProps از جزء

برای اطمینان از اینکه نوع صحیح کامپوننت را ارائه می کنیم، می توانیم یک رابط تعریف کنیم User که نوع مورد نیاز ما را گسترش می دهد OptionProps از جانب <MySelect />. این قابلیت واردات انواع نیز به تازگی اضافه شده است.

نوع وارد کردن از OptionProps


4. ما می توانیم مطمئن شویم که modelValue ما واقعاً با ورودی مطابقت دارد

از آنجایی که modelValue به یک مقدار اولیه از نوع ارائه شده با گزینه های prop نیاز دارد، شکایت می کند زیرا ویژگی ارائه شده در این مورد معتبر نیست.

نوع اشتباه modelValue


این یک بسته بندی است!

من واقعاً فکر می‌کنم که Vue 3.3 هنگام استفاده از Typescript و ساخت اجزای ایمن تایپ یک تقویت بزرگ برای DX کلی است. برای من شخصاً این یک افزایش بزرگ در بهره وری خواهد بود و مشتاقانه منتظر هستم که این را در پروژه های آینده خود ادغام کنم.

شما چی فکر میکنید؟ آیا در واقع از Typescript با Vue استفاده می کنید؟ آیا تاکنون از ویژگی های جدید استفاده کرده اید؟ و آیا فکر می کنید جایی را پیدا خواهید کرد که بخواهید Generics را برای تایپ قوی اجزای خود اعمال کنید؟

اگر این مقاله را دوست داشتید، خوشحال می شوم اگر لایک بگذارید یا از شما بشنوم.

با تشکر برای خواندن و هک مبارک! ❤️ 💻

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا