导入.svelte.ts文件到.svelte组件时出现编译错误
导入.svelte.ts文件到.svelte组件时出现编译错误
看起来你是把.svelte.ts文件的用途搞混啦,咱们一步步来理清楚问题出在哪,以及怎么解决:
首先,你遇到的编译错误,核心原因是**.svelte.ts是Svelte组件的专用辅助文件,不是用来存放可复用状态的独立模块**,而且Svelte的编译逻辑里,.svelte文件并不会导出其对应.svelte.ts文件里的内容,所以你从./TopBar.svelte导入menuButtonVisible肯定会找不到。
正确的解决思路
如果你想把状态抽成单独文件复用,直接用普通的.ts文件就好,完全不需要用.svelte.ts。给你改个示例:
- 新建一个普通的状态文件,比如
menuState.ts:
export const menuButtonVisible = $state(false);
- 在你的
TopBar.svelte里直接导入这个文件:
<script lang="ts"> // 直接导入普通ts文件里的状态 import { menuButtonVisible } from './menuState.ts'; </script>
额外提醒:关于跨组件共享状态
你提到想参考文档里的stores用法,这里要注意:$state是模块级别的状态,每个导入这个模块的组件会拿到独立的状态实例,如果你的需求是跨多个组件共享同一份状态(比如改了一个组件里的状态,其他组件也同步更新),那$state就不够用了,这时候应该用Svelte的$store API来创建可共享的store,或者结合上下文(setContext/getContext)来传递状态。
再说说.svelte.ts的正确用法
.svelte.ts文件是用来和对应的.svelte组件配对使用的,比如给组件定义Props类型、导出组件相关的工具函数,而不是存放全局/可复用状态。举个正确的例子:
TopBar.svelte.ts:
// 导出TopBar组件的Props类型 export type TopBarProps = { title: string; showMenu: boolean; };
TopBar.svelte:
<script lang="ts"> // 从对应的.svelte.ts文件导入类型(注意这里是类型导入,不是值导入) import type { TopBarProps } from './TopBar.svelte'; let props: TopBarProps = { title: '我的应用', showMenu: true }; </script>
备注:内容来源于stack exchange,提问作者Gabriel Espinel
相关产品推荐
相关产品推荐

