هل طلب الميزة الخاص بك متعلق بمشكلة؟
أتلقى الخطأ التالي عندما أحاول إضافة أحداث مخصصة على عناصر DOM الأصلية:
Type '{ onswipestart: (event: CustomEvent<any>) => void; onswipemove: (event: CustomEvent<any>) => void; onswipeend: (event: CustomEvent<any>) => void; style: string; class: string; }' is not assignable to type 'HTMLProps<HTMLDivElement>'.
Property 'onswipestart' does not exist on type 'HTMLProps<HTMLDivElement>'.ts(2322)
يتم إرسال الأحداث المخصصة إلى عنصر div
باستخدام إجراءات Sveltes / استخدام التوجيه https://svelte.dev/examples#actions).
صِف الحل الذي تريده
كن قادرًا على كتابة التحقق من الأحداث المخصصة المرسلة باستخدام إجراءات Svelte على عناصر DOM الأصلية.
صِف البدائل التي فكرت فيها
يمكنني محاولة تحويل div إلى مكون Svelte فردي ولكن يفضل أن يعمل على عناصر DOM الأصلية أيضًا.
سياق إضافي
هذه هي الطريقة التي أستمع بها إلى الأحداث المخصصة:
<div
class="bottomSheet"
class:draggable
bind:this={bottomSheet}
use:swipeable
on:swipestart={handleSwipeStart}
on:swipemove={handleSwipeMove}
on:swipeend={handleSwipeEnd}
style="height:{height};bottom:{bottom};transform:translateY({$coords.ty}px);"
>
طلب سحب ذو صلة لأحداث مخصصة على مكونات Svelte: https://github.com/sveltejs/language-tools/pull/303
لا أعرف ما إذا كانت هناك طريقة لجعلها تنطبق فقط على العناصر ذات الإجراء. ولكن يمكنك إتاحته عالميًا مثل هذا.
declare namespace svelte.JSX {
interface HTMLAttributes<T> {
onswipemove?: (event: CustomEvent<number> & { target: EventTarget & T }) => any;
}
}
يمكننا أيضًا تحسين كتاباتنا من خلال "الرجوع إلى CustomEvent<any>
ولكني أفضل عدم القيام بذلك لأن الآخرين قد يعتمدون على الكتابة لإلقاء خطأ" غير موجود "إذا أخطأوا في كتابة حدث. حسنًا بشيء من هذا القبيل إذا تم تطبيقه فقط على العناصر ذات الإجراءات ، لكنني لست متأكدًا من كيفية تنفيذ ذلك.
أعتقد أن استنتاج النوع من الإجراء هو مهمة شبه مستحيلة. ربما يمكننا إيجاد طريقة للسماح للمستخدم بكتابة الإجراء وأحداثه المحتملة صراحة.
شكرًا ، السماح للمستخدم بكتابة الإجراء صراحة أو اختيار الوقت المناسب للعودة إلى CustomEvent<any>
ربما يكون أفضل سيناريو للحالة ، لكن الحل بواسطة @ jasonlyu123 جيد بما يكفي بالنسبة لي الآن. شكرا على العمل العظيم!
ألقيت نظرة على هذا مرة أخرى والآن أنا منقسمة بشأن أفضل طريقة للمضي قدمًا.
يمكننا إسكات الخطأ إذا كان حدثًا on:XX
على عنصر DOM بتوجيه use:YY
. العيب هو أن الحدث من أي نوع ضمنيًا. كما أنه قد لا يلتقط جميع الحالات ، لأن Svelte ديناميكي للغاية بطبيعته ، يمكن لأي شخص القيام بفقاعات CustomEvents.
CustomEvent<any>
احتياطيًاسنضيف بشكل أساسي & {[key: string]: CustomEvent<any>}
إلى جميع كتابات العناصر الداخلية. هذا يعني أن أي سمة غير مذكورة أعلاه سترجع إلى CustomEvent<any>
. سيؤدي هذا إلى إصلاح مشكلة "الطبيعة الديناميكية" ومشكلة "أي ضمني" للخيار 1. ولكنه أيضًا خطأ في الحالات التي يستخدم فيها شخص ما سمة مخصصة مثل myownAttribute
.
any
احتياطيًامثل الخيار 2 ، فقط نقوم بإضافة & {[key: string]: any}
احتياطيًا. هذا يعني أن أي شيء لا يصلح يعود إلى أي شيء. هذا يناسب الطبيعة الديناميكية لـ DOM بشكل أفضل على حساب عدم اكتشاف الأخطاء المطبعية بعد الآن.
التعليق الأكثر فائدة
لا أعرف ما إذا كانت هناك طريقة لجعلها تنطبق فقط على العناصر ذات الإجراء. ولكن يمكنك إتاحته عالميًا مثل هذا.