打字稿错误 TS2345 错误:TS2345:“缓冲区”类型的参数不可分配给“字符串”类型的参数

Posted

技术标签:

【中文标题】打字稿错误 TS2345 错误:TS2345:“缓冲区”类型的参数不可分配给“字符串”类型的参数【英文标题】:Typescript error TS2345 Error: TS2345:Argument of type 'Buffer' is not assignable to parameter of type 'string' 【发布时间】:2018-02-21 18:00:14 【问题描述】:

Typescript 新手。我正在从 RabbitMQ 通道读取一些数据并将其转换为 JSON 对象。在这一行中,我得到了错误

让communicationInformation = JSON.parse(newCommunication.content);

TS2345:“缓冲区”类型的参数不可分配给“字符串”类型的参数。

我需要转换数据吗?我正在使用 Typescript 2.4.1

 Amqplib.connect(amqpLibUrl, (err, connection) => 
if (!err) 
    connection.createChannel((err, channel) => 
        channel.consume('QueueName', newCommunication => 
            if (newCommunication != null) 
                let communicationInformation = JSON.parse(newCommunication.content);
                // Code 
            
        )
    )

);

【问题讨论】:

【参考方案1】:

我认为错误是在JSON.parse的输入参数上抛出的。尝试先在其上调用toString,然后传递给函数。

let communicationInformation = JSON.parse(newCommunication.content.toString());

【讨论】:

在我的情况下不起作用“错误 TS2531:对象可能为 'null'。” 或者使用Buffer().toJSON() 不要在这种情况下使用Buffer().toJSON(),它看起来是一个优雅的解决方案,但实际上它会为您提供缓冲区的 JSON 表示,而不是缓冲区中的字节。例如type:'Buffer', data: [ 123 10, ....]【参考方案2】:

我不确定什么是 newCommunication.content。就我而言,它是一个文件,我必须为 fs.readFileSync 指定编码:

 const level = JSON.parse(fs.readFileSync('./path/to/file.json', 'utf-8'));

【讨论】:

【参考方案3】:

下一个错误是error TS2531: Object is possibly 'null'.

您必须在编译器中禁用 strictNullChecks

【讨论】:

我会解释为什么人们不赞成这个而不是不加解释地反对打字稿的全部意义在于严格的类型检查,这样你就不会犯错误因此,打字稿想让你做什么像这样的错误是显式检查对象是否为空,例如:if (obj === null) //do something else //Your original code

以上是关于打字稿错误 TS2345 错误:TS2345:“缓冲区”类型的参数不可分配给“字符串”类型的参数的主要内容,如果未能解决你的问题,请参考以下文章

常规快递代码上的打字稿错误 TS2345

错误 TS2345:“菜单”类型的参数不可分配给类型参数

对象 args 中的键写为 [someKey] 时出现 TS2345 错误

带有动态分配的 Typescript 2.9 错误

尝试在打字稿中使用猫鼬和 bcrypt 比较密码

打字稿键盘事件:“事件”类型的参数不可分配给“键盘事件”类型的参数