坚持向 Discord Client 对象 Typescript 添加变量

Hal*_*ouf 2 javascript node.js typescript discord discord.js

我是 Typescript 的新手,正在使用 Typescript 编写一个 Discord 机器人。我想向 Client 对象添加一个变量“命令”。例如在 Javascript 中,你使用这个:

Javascript

const { Client } = require('discord.js');
const client = new Client();
client.commands = 'commands';
console.log(client.commands);
// 'commands'
Run Code Online (Sandbox Code Playgroud)

但现在我想添加一些类似于 Typescript 的东西。但是当我在 Typescript 中使用它时,出现以下错误:

Property 'commands' does not exist on type 'Client'.ts(2339)
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

我目前的代码:

Property 'commands' does not exist on type 'Client'.ts(2339)
Run Code Online (Sandbox Code Playgroud)

Owl*_*Owl 5

使用打字稿并遵循https://discordjs.guide的指南时,我遇到了同样的问题

默认情况下,commands不是Discord.Client对象的现有属性类型,但您可以通过创建.d.ts文件轻松地使用您自己的类型扩展 Discord.js 类型。

discord.d.ts我的项目目录中有文件,它包含:

declare module "discord.js" {
    export interface Client {
        commands: Collection<unknown, any>
    }
}
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题。

如果您使用discord.js 指南中的单文件样式命令,甚至更好:

import { Message } from "discord.js";

declare module "discord.js" {
    export interface Client {
        commands: Collection<unknown, Command>
    }

    export interface Command {
        name: string,
        description: string,
        execute: (message: Message, args: string[]) => SomeType // Can be `Promise<SomeType>` if using async
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,您还可以在从 访问命令对象时获得代码完成this.client.commands.get("commandName")Command如果需要,您还可以从 导入类型import { Command } from "discord.js"

当我想从我的命令文件中严格键入导出的命令时,我发现这很有用,例如:

import { Command } from "discord.js";

// Now `command` is strictly typed to `Command` interface
const command: Command = {
    name: "someCommand",
    description: "Some Command",
    execute(message, args): SomeType /* Can be Promise<SomeType> if using async */ {
        // do something
    }
};

export = command;
Run Code Online (Sandbox Code Playgroud)