dan*_*bgd 5 typescript svelte sveltekit
我正在使用下面的 clickOutside 操作。
export function clickOutside(node: HTMLElement) {
function detect({ target }: MouseEvent) {
if (!node.contains(target as Node)) {
node.dispatchEvent(new CustomEvent('clickoutside'));
}
}
document.addEventListener('click', detect, { passive: true, capture: true });
return {
destroy() {
document.removeEventListener('click', detect);
},
};
Run Code Online (Sandbox Code Playgroud)
当我将鼠标悬停在:clickoutside={() => {}} 上时,我仍然遇到此错误
Type '{ onclickoutside: () => void; class: string; }' is not assignable to type 'HTMLProps<HTMLDivElement>'.
Property 'onclickoutside' does not exist on type 'HTMLProps<HTMLDivElement>'}
Run Code Online (Sandbox Code Playgroud)
我在 svelte 套件中尝试过这个app.d.ts
declare namespace svelte.JSX {
interface HTMLAttributes<T> {
clickoutside?: (event: CustomEvent) => void;
}
}
Run Code Online (Sandbox Code Playgroud)
我也尝试了HTMLProps<T>许多HTMLProps<HTMLDivElement>其他变体,但没有任何效果。我重新启动 ts 服务器 25 次,所以不是这样的。这是文档的链接
不,这不是重复的,因为我确实浏览了所有其他答案,但它们不起作用。像这个:例子
实际上我也遇到了同样的问题,文档确实提供了一个很好的解决方案。\n我所做的是修改我的app.d.ts界面以包含我的界面。\n这是我的操作:
import { browser } from \'$app/environment\'\n\nlet iob: IntersectionObserver\n\nconst initializeIob = () => {\n console.log(\'called\')\n\n iob = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n const customEventName = entry.isIntersecting\n ? \'viewportEnter\'\n : \'viewportExit\'\n entry.target.dispatchEvent(new CustomEvent(customEventName))\n })\n })\n}\n\nconst viewport = (element: HTMLElement) => {\n if (!iob && browser) initializeIob()\n\n iob.observe(element)\n\n return {\n destroy() {\n iob.unobserve(element)\n },\n }\n}\n\nexport default viewport\nRun Code Online (Sandbox Code Playgroud)\n你可以看到我需要在我的html 元素viewportEnter中使用它\n修改后的 \xc3\xa0pp.d.ts` 看起来像这样:on:
declare global {\n namespace App {\n // interface Error {}\n // interface Locals {}\n // interface PageData {}\n // interface Platform {}\n }\n namespace svelteHTML {\n interface HTMLAttributes<T> {\n \'on:viewportEnter\'?: (event: CustomEvent) => void\n \'on:viewportExit\'?: (event: CustomEvent) => void\n }\n }\n}\n\nexport {}\nRun Code Online (Sandbox Code Playgroud)\n在我的html 元素中使用它
\n<h1\n style="text-align: center;"\n use:viewport\n on:viewportEnter={() => {\n console.log("Entered");\n }}\n on:viewportExit={() => {\n console.log("Exit");\n }}\n>\n Hello Actions with Intersection observer!\n</h1>\nRun Code Online (Sandbox Code Playgroud)\n它按预期工作。
\n当前正确的声明应该是:
declare namespace svelteHTML {
interface HTMLAttributes<T> {
'on:clickoutside'?: (event: CustomEvent) => void;
}
}
Run Code Online (Sandbox Code Playgroud)
(旧版本使用不同的命名空间/类型,请参阅迁移指南。)
| 归档时间: |
|
| 查看次数: |
2900 次 |
| 最近记录: |