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

如何在SvelteKit的JavaScript+JSDoc中导入模块类型定义?

在SvelteKit中通过JSDoc导入MikroORM类型定义的正确方式

问题描述

我正在SvelteKit应用中尝试通过JSDoc从模块导入类型定义,想要用JS/JSDoc实现下面这段TypeScript代码的类型效果:

import type { PostgreSqlDriver } from '@mikro-orm/postgresql'; // 或其他驱动包

const orm = await MikroORM.init<PostgreSqlDriver>({
  entities: ['./dist/entities'], // JS实体路径(dist),相对于`baseDir`
  entitiesTs: ['./src/entities'], // TS实体路径(src),相对于`baseDir`
  dbName: 'my-db-name',
  type: 'postgresql',
});
console.log(orm.em); // 通过`em`属性访问EntityManager

但我目前的JS代码在VS Code中报错,代码如下:

import { MikroORM } from '@mikro-orm/core';

/** @type {import("@mikro-orm/postgresql").PostgreSqlDriver } */

/** @type {PostgreSqlDriver } */ // Cannot find name 'PostgreSqlDriver'.ts(2304)
export const orm = await MikroORM.init({
    dbName: 'my-db-name',
    type: 'postgresql',
});

需要解决如何正确实现类型定义的导入。

解决方案

方法1:直接在返回类型中指定泛型

不需要单独声明类型,直接在JSDoc的@type里结合ReturnType和导入类型,给orm指定正确的实例类型:

import { MikroORM } from '@mikro-orm/core';

/**
 * @type {ReturnType<typeof MikroORM.init<import("@mikro-orm/postgresql").PostgreSqlDriver>>}
 */
export const orm = await MikroORM.init({
    dbName: 'my-db-name',
    type: 'postgresql',
});

方法2:先定义类型别名再复用

如果需要在多个地方使用PostgreSqlDriver类型,可以先用@typedef定义别名,之后直接引用:

import { MikroORM } from '@mikro-orm/core';

/**
 * @typedef {import("@mikro-orm/postgresql").PostgreSqlDriver} PostgreSqlDriver
 */

/**
 * @type {ReturnType<typeof MikroORM.init<PostgreSqlDriver>>}
 */
export const orm = await MikroORM.init({
    dbName: 'my-db-name',
    type: 'postgresql',
});

关键提示

  • 单独的@type注释如果没有绑定到变量或用@typedef声明,不会创建可全局引用的类型,所以直接写/** @type {PostgreSqlDriver} */会报错找不到名称。
  • ReturnType<typeof MikroORM.init<...>>的作用是获取MikroORM.init方法传入指定泛型后的返回类型,和TS中<PostgreSqlDriver>泛型约束的效果一致。
  • 确保已安装@mikro-orm/postgresql依赖,否则类型导入会失败。

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:27:37