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

如何在for循环中将require转换为import(Discord.js+TypeScript场景)

TypeScript下实现Discord.js命令文件的动态导入

问题背景

Discord.js官方指南中的命令加载代码采用CommonJS规范,通过require动态加载命令文件,现在需要在TypeScript项目中实现等价的导入逻辑。

原CommonJS代码:

client.commands = new Collection();

const commandsPath = path.join(__dirname, 'commands');
const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith('.js'));

for (const file of commandFiles) {
    const filePath = path.join(commandsPath, file);
    const command = require(filePath);
    // Set a new item in the Collection with the key as the command name and the value as the exported module
    if ('data' in command && 'execute' in command) {
        client.commands.set(command.data.name, command);
    } else {
        console.log(`[WARNING] The command at ${filePath} is missing a required "data" or "execute" property.`);
    }
}

问题:如何在TypeScript中实现上述代码的等价动态导入行为?

实现方案

1. 使用ES模块动态导入(import())

TypeScript支持ES模块的动态导入语法,结合异步逻辑实现命令加载,同时建议通过类型定义保证代码安全:

import { Collection } from 'discord.js';
import * as path from 'path';
import * as fs from 'fs/promises';

// 定义命令的类型约束
interface Command {
    data: { name: string };
    execute: (...args: any[]) => Promise<void> | void;
}

client.commands = new Collection<string, Command>();

async function loadCommands() {
    const commandsPath = path.join(__dirname, 'commands');
    // 开发环境加载.ts文件,生产环境加载编译后的.js文件
    const fileExt = process.env.NODE_ENV === 'development' ? '.ts' : '.js';
    const commandFiles = (await fs.readdir(commandsPath)).filter(file => file.endsWith(fileExt));

    for (const file of commandFiles) {
        const filePath = path.join(commandsPath, file);
        // 动态导入模块,适配命令文件的default导出
        const { default: command } = await import(filePath);
        
        if ('data' in command && 'execute' in command) {
            client.commands.set(command.data.name, command);
        } else {
            console.warn(`[WARNING] 命令文件 ${filePath} 缺少必填的"data"或"execute"属性`);
        }
    }
}

// 执行命令加载逻辑
loadCommands().catch(console.error);

2. 调整TypeScript编译配置

确保tsconfig.json中的关键配置符合要求:

  • module设置为ESNext或NodeNext,启用ES模块支持
  • moduleResolution设置为NodeNext或Node16,匹配模块解析规则
  • 命令文件统一使用export default导出命令对象,保证动态导入时的一致性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:25:39