ember.js - مدیریت میکسینها با Ember CLI و تایپاسکریپت
فقط میخواهم بدانم بهترین روش برای مدیریت مناسب میکسینها در یک برنامه امبر تایپشده چیست. واضح است که حذف میکسینها از برنامه بهترین گزینه است؛ با این حال، اکثر افزونهها هنوز از تایپاسکریپت پشتیبانی نمیکنند. با این حال، بهترین روش برای استفاده از میکسین مسیر برنامهی ember-simple-auth (یا هر میکسین دیگری از آنها) چیست؟ من کد زیر را آزمایش نکردهام اما حدس میزنم چیزی در این راستا باید کار کند؛ با این حال، کمی احساس عجیب بودن میکند:
import Route from '@ember/routing/route';
import ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mixin';
export default class ApplicationRoute extends Route.extend(ApplicationRouteMixin, {
// Prototype Code Here?
}) {
// Class TS Code Here?
}
یک بار دیگر، من این را امتحان نکردهام و تازه شروع به سفر به سمت TypeScript کردهام، بنابراین لطفاً صبور باشید. هرگونه کمک و توضیحی قدردانی خواهد شد.
پاسخ شماره ۱
شما پایه مناسب را به درستی پیش میبرید. نمونههای کلاسیک Mixin امبر باید به پروتوتایپ متصل شوند. توجه داشته باشید که هر چیزی که در ادامه آمده به همان اندازه برای کلاسهای ES6 نیز قابل اعمال است؛ کلاسهای TypeScript نیز تحت تأثیر قرار میگیرند تنها به این دلیل که آنها عمدتاً فقط نوعهایی روی کلاسهای ES6 هستند.
import Route from '@ember/routing/route';
import ApplicationRouteMixin from 'ember-simple-auth/mixins/application-route-mixin';
export default class ApplicationRoute extends Route.extend(ApplicationRouteMixin, {
// anything required by the mixin has to go here
}) {
// normal class code, which can *depend* on the mixin but is effectively
// invisible to the mixin
}
یک راه مفید برای فکر کردن در مورد این این است که جسم Literal ای که به کلاس .extend() میدهید خودش صرفاً یک مخلوطکننده (Mixin) است.
این الگو بهترین کاربرد را برای راهحلهای سازگار با نسخههای قبلی یا مکانهایی دارد که توسط یک افزونه لازم است. میکسینها در بهترین حالت به سختی با تایپاسکریپت به صورت صحیح بررسی نوع میشوند و همانطور که این مثال نشان میدهد، تعاملات عجیب و غریب و غیرمنتظرهای با کلاسها دارند. (عجیب بودنها در اینجا به همان اندازه برای کد جاوااسکریپت ساده که از کلاسهای ES6 استفاده میکند نیز صدق میکند.)
هر زمان که در حال نوشتن کد جدید هستید، معمولاً بهتر است که عملکرد را برای انجام یکی از چند گزینه استخراج کنید:
از وراثت معمولی استفاده کنید، با یک کلاس پایه واحد. هر جا که یک میکسین واحد داشته باشید، این معمولاً سادهترین راهحل است.
به جای آن، فقط به تعریف توابع خالص بپردازید، مثلاً در
app/lib/validation، و آنها را با آرگومانهای مناسب از نمونههای کلاس فراخوانی کنید.
