You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 02:36:29