坚持将变量添加到 Discord Client 对象 Typescript
我是 Typescript 的新手,正在使用 Typescript 编写一个 Discord 机器人.我想添加一个变量commands"到客户端对象.例如在 Javascript 中,你使用这个:
Im new to Typescript and writing a Discord bot using Typescript. I want to add a variable "commands" to the Client object. For example in Javascript, you using this:
Javascript
const { Client } = require('discord.js');
const client = new Client();
client.commands = 'commands';
console.log(client.commands);
// 'commands'
但现在我想添加类似于 Typescript 的内容.但是当我在 Typescript 中使用它时,出现以下错误:
but now I want to add something similar to Typescript. But when Im using this in Typescript, I got the following error:
Property 'commands' does not exist on type 'Client'.ts(2339)
我该如何解决这个问题?
How can I solve this?
我现在的代码:
export class HalloClient {
private client: Client;
constructor() {
this.client = new Client();
this.client.commands = new Collection();
}
public start(): void {
console.log(`- Client | Starting process...`);
new RegisterEvents('../events/', this.client).load();
new MongoConnection(process.env.mongouri).createConnection();
console.log(this.client);
this.client.login(process.env.token);
}
}
推荐答案
我在使用 typescript 并遵循 https://discordjs.guide
I was having the same issue when using typescript and following the guide from https://discordjs.guide
默认情况下,commands
不是 Discord.Client
对象上的现有属性类型,但您可以通过创建一个 <代码>.d.ts 文件.
By default, commands
is not an existing attribute type on Discord.Client
object, but you can easily extend Discord.js typings with your own type by creating a .d.ts
file.
我的项目目录中有 discord.d.ts
文件,它包含:
I have discord.d.ts
file on my project directory, and it contains:
declare module "discord.js" {
export interface Client {
commands: Collection<unknown, any>
}
}
这解决了我的问题.
如果您使用 discord.js 指南中的单文件样式命令,效果会更好:
Or even better if you are using the single-file style command from discord.js guide:
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
}
}
这样,在this.client.commands.get("commandName")
中访问命令对象时也可以得到代码补全,也可以导入Command
如果需要,请从 import { Command } from "discord.js"
输入.
This way, you also get code completion when accessing a command object from this.client.commands.get("commandName")
, and you also can import Command
type if you need it from import { Command } from "discord.js"
.
当我想从命令文件中严格键入导出的命令时,我发现这很有用,例如:
I find this useful when I want to strictly type my exported command from my command file, for example:
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;
相关文章