Discord.js 指南:Typescript 中的“Client<boolean>”类型上不存在属性“commands”

dev*_*leo 7 typescript discord discord.js

node:v16.11.0 "discord.js": "^13.2.0"

我正在设置一个示例 Discord.js 机器人。

本指南中,我要添加这一行:

client.commands = new Collection();

Typescript 然后抱怨:Property 'commands' does not exist on type 'Client<boolean>'

这个答案似乎和我想要的一脉相承。但是我仍然遇到一些问题。如果我添加 adeclare module "discord.js"并声明新类型,它似乎不会扩展现有类型,而是会覆盖它。当我这样做时,它不知道Collection我的自定义类型文件中的 a 是什么,因为这是新的 Discord.js 库的自定义内容。我不禁觉得官方指南不应该要求这样做。

我想知道是否有其他人制作了 typescript Discord 机器人并找到了解决此问题的更新解决方案。

感谢您的时间。

dev*_*leo 14

-编辑-

因此,我有机会在搜索中找到自己的问题,并发现我最初回答了错误的问题。事实证明,我们在遵循 Discord.js 指南时收到此错误的原因是因为commandsClient 类上根本没有属性。这只是指南使用的一种模式,Typescript 指出了它。

一旦我为我的项目正确设置了 Typescript,添加该命令就代表Collection<any, any>工作正常。

src/@types/discord.d.ts

import { Collection } from "discord.js";

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

tsconfig.json

{
  "compilerOptions": {
    "typeRoots": ["src/@types", "node_modules/@types"],
    "outDir": "dist"
  },
  "include": ["src"],
  "exclude": ["node_modules"],
  "extends": "@tsconfig/node18/tsconfig.json"
}
Run Code Online (Sandbox Code Playgroud)

-旧答案-

好的。所以我想通了。

创造types/common/discord.d.ts

不要做我所做的事情,只需包括以下内容:

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

确保它位于顶部。

import { Collection } from "discord.js";
Run Code Online (Sandbox Code Playgroud)

然后它实际上会扩展现有的定义并引入Collection定义而不是替换它。

"@typescript-eslint/no-explicit-any": "off"由于Collection扩展Map和获取任何值,该解决方案还需要添加到 es-lint 中。

  • 不适合我。“import { Collection }”行现在会抛出以下错误“导入别名'Collection'.ts(2303)的循环定义”和“模块'“discord.js”'在本地声明'Collection',但未导出。 TS(2459)` (3认同)