你好,所以在这里我想用discord.js(node.js)和诸如opusscript和ytdl-core之类的扩展名编写一个discord机器人,如果使用此代码,我会出错。 感谢您的回答。
import * as Discord from "discord.js";
import {IBotCommand} from "../api";
var servers = {};
const ytdl = require("ytdl-core");
export default class play implements IBotCommand {
private readonly _command = "play"
help(): string {
return "Cette commande ne fait absolument rien c'est juste pour le fun :)";
}
isThisCommand(command: string): boolean {
return command === this._command;
}
async runCommand(args: string[], msgObject: Discord.Message, client:Discord.Client): Promise<void> {
function play(connection: Discord.VoiceConnection, msgObject: Discord.Message){
var server = servers[msgObject.guild.id];
server.dispatcher = connection.playStream(ytdl(server.queue[0], {filter: "audionly"}));
server.queue.shift();
server.dispatcher.on("end", function(){
if(server.queue[0]){
play(connection, msgObject);
} else {
connection.disconnect();
}
})
}
if(!args[1]) {
msgObject.channel.send("Vous devez donner un lien valide !");
return;
}
if(!msgObject.member.voiceChannel) {
msgObject.channel.send("Vous devez être dans un channel vocal pour jouer une musique !");
return;
}
if(!servers[msgObject.guild.id]) servers[msgObject.guild.id] = {
queue: []
}
var server = servers[msgObject.guild.id];
server.queue.push(args[1]);
if(!msgObject.guild.voiceConnection) msgObject.member.voiceChannel.join().then(function(connection){
play(connection, msgObject);
})
}
}
错误ts(7053)
元素隐式地具有“ any”类型,因为类型“ string”的表达式不能用于索引类型“ {}”。 在类型“ {}”上找不到参数类型为“字符串”的索引签名。
答案 0 :(得分:1)
您需要为servers
添加类型。目前,打字稿正处于最佳猜测状态,并假定它是一个空对象。您可以使用index type,类似这样的内容(我不完全知道您希望Server类型是什么样,所以请随意使其更具体以满足您的需求):
interface Server {
queue: any[]
}
var servers: { [key: string]: Server } = {};
答案 1 :(得分:1)
我认为问题出在线路上
var server = servers[msgObject.guild.id];
TS推断server
为空对象类型,并且正确地将空对象放在其中。这意味着您无法使用该对象的任何属性,因为没有属性。要解决此问题,您至少需要将服务器定义为一些
var servers: Record<string, any> = {} // any mean that value can be anything
但是这将起作用,但是由于将server用作具有dispatch
之类的方法的服务器,因此在下一行中将没有类型检查。因此,要使其在类型级别正常工作,您需要以更特定的方式定义服务器类型,因此,从Record<string, any>
开始,您需要更加精确并定义服务器类型并将其设置为{{1} }