我可以为打字稿中的错误ts(7053)寻求帮助吗?

时间:2019-10-26 20:43:49

标签: node.js typescript discord.js

你好,所以在这里我想用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”的表达式不能用于索引类型“ {}”。     在类型“ {}”上找不到参数类型为“字符串”的索引签名。

2 个答案:

答案 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} }