typescript Vitest defineConfig,类型“UserConfigExport”中不存在“test”

eh57zj3b  于 2023-01-06  发布在  TypeScript
关注(0)|答案(4)|浏览(1148)

尝试在一个已经存在的vite(vue 3,typescript)项目上设置vitest。
我的vite. config. ts看起来像这样:

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
  test: {
    globals: true,
    environment: 'jsdom',
  },
  plugins: [vue()],
});

但在VS代码中,它会抱怨:

悬停时,我看到:
类型为"{test:{全局:布尔值;环境:字符串;};插件:"插件[];}"不能赋给类型"UserConfigExport"的参数。对象文本只能指定已知属性,并且类型"UserConfigExport"中不存在"test"。ts(2345)
我可以让它消失,如果我改变这一行:

import { defineConfig } from 'vite';

收件人:

import { defineConfig } from 'vitest/config';

但是为什么呢?这是怎么回事?为什么我必须从vitest导入defineConfig才能让它支持test属性呢?

2cmtqfgy

2cmtqfgy1#

    • 简短答复:**

因为这是TypeScript的工作方式。Vite配置接口不知道任何关于Vitest的信息,TS不允许过多的属性(不是由类型/接口定义的属性)
因为Vite本身不知道Vitest及其配置,所以Vitest必须extend Vite配置(定义为TS接口)
要使用此扩展接口(而不是原始接口),必须首先导入它。
或者,您也可以使用Configuring Vitest中介绍的"三斜杠命令

/// <reference types="vitest" />
import { defineConfig } from 'vite'

export default defineConfig({
  test: {
    // ...
  },
})
mftmpeh8

mftmpeh82#

我也遇到过类似的情况,问我同样的问题,结果是这样的:

/// <reference types="vitest" />
import { defineConfig } from 'vite';
import type { UserConfig as VitestUserConfigInterface } from 'vitest/config';

const vitestConfig: VitestUserConfigInterface = {
  test: {
    // vitest config, with helpful vitest typing :)
  }
};

export default defineConfig({
  test: vitestConfig.test,
  // and now: just vite config
});

可能会有帮助。

cedebl8k

cedebl8k3#

下面是我所做的,以防有人还在寻找解决方案。我创建了自己的类型,并扩展到UserConfig

...
import type { InlineConfig } from 'vitest';
import type { UserConfig } from 'vite';

interface VitestConfigExport extends UserConfig {
  test: InlineConfig;
}
...

然后,我将config对象的类型强制转换为我的自定义接口-

export default defineConfig({
  plugins: [solidPlugin()],
  server: {
    port: 3000,
  },
  test: {
    environment: 'jsdom',
    globals: true,
    transformMode: {
      web: [/\.[jt]sx?$/],
    },
    setupFiles: './setupVitest.ts',
  },
  build: {
    target: 'esnext',
  },
} as VitestConfigExport);

这也为新的test属性启用了intellisense。另外,你不需要声明/// <reference types="vitest" />。这可能会有帮助。

57hvy0tb

57hvy0tb4#

我分开了文件,因为我从这个问题中得到了,如果我把导入改为vitest,我在插件React行中得到了另一个错误。

  • vite.config.ts
  • vitest.config.ts

维生素试验:

import { defineConfig } from 'vitest/config';

    export default defineConfig({
        test: {
          globals: true,
          environment: 'jsdom'
        },
      })

地址:

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

export default defineConfig({
  plugins: [react()],
  server: {
    port: 3000,
  },
})

相关问题