从Svelte组件导出函数至Jest测试时遇类型错误求助
解决Svelte组件导出函数到Jest测试的TS报错问题
针对你遇到的两种TS错误,分场景给出具体解决方法:
场景1:导出不依赖组件实例的工具函数
如果updateEnabledSubmitSignup是不需要访问组件内部状态(比如props、反应式变量)的纯工具函数,用<script context="module">导出是正确的,但需要解决TypeScript类型识别问题:
组件代码(index.svelte)
<script context="module" lang="ts"> // 导出纯工具函数 export function updateEnabledSubmitSignup(inputValue: string): boolean { return inputValue.trim().length > 0; } </script> <script lang="ts"> // 组件实例内部逻辑 </script>
修复TS2614报错
创建同目录的类型声明文件index.svelte.d.ts,手动声明导出的函数:
import type { SvelteComponentDev } from 'svelte/internal'; // 声明组件类 export declare class SignupForm extends SvelteComponentDev {} // 声明导出的工具函数 export declare function updateEnabledSubmitSignup(inputValue: string): boolean;
测试文件调用
import { updateEnabledSubmitSignup } from './index.svelte'; test('updateEnabledSubmitSignup validates input', () => { expect(updateEnabledSubmitSignup('')).toBe(false); expect(updateEnabledSubmitSignup('test')).toBe(true); });
场景2:导出依赖组件实例的方法
如果函数需要访问组件内部状态(比如表单校验依赖组件的输入值),需要把函数挂载到组件实例上:
组件代码(index.svelte)
<script lang="ts"> let email = ''; let password = ''; // 导出实例方法,可访问组件内部状态 export function updateEnabledSubmitSignup(): boolean { return email.includes('@') && password.length >= 6; } </script>
修复TS2339报错
测试时需要先创建组件实例,通过类型断言或自定义类型声明来调用方法:
方式1:类型断言快速解决
import { render } from '@testing-library/svelte'; import SignupForm from './index.svelte'; test('updateEnabledSubmitSignup checks form validity', async () => { const { component } = render(SignupForm); // 类型断言告诉TS组件实例包含自定义方法 const formComponent = component as typeof SignupForm & { updateEnabledSubmitSignup: () => boolean; }; expect(formComponent.updateEnabledSubmitSignup()).toBe(false); // 模拟输入后再次测试 // ... });
方式2:自定义类型声明(更优雅)
创建index.svelte.d.ts:
import type { SvelteComponentDev } from 'svelte/internal'; export interface SignupFormInstance extends SvelteComponentDev { updateEnabledSubmitSignup: () => boolean; } declare class SignupForm extends SignupFormInstance {} export default SignupForm;
测试文件中指定类型:
import { render } from '@testing-library/svelte'; import type { SignupFormInstance } from './index.svelte'; import SignupForm from './index.svelte'; test('updateEnabledSubmitSignup works', async () => { const { component } = render<SignupFormInstance>(SignupForm); expect(component.updateEnabledSubmitSignup()).toBe(false); });
额外配置检查
确保Jest能正确处理Svelte文件,在jest.config.js中配置:
module.exports = { transform: { '^.+\\.svelte$': ['svelte-jester', { preprocess: true }], '^.+\\.ts$': 'ts-jest', }, moduleFileExtensions: ['js', 'ts', 'svelte'], };
内容的提问来源于stack exchange,提问作者plutownium
相关产品推荐
相关产品推荐

