如何提示我无法控制的函数的类型?

WoJ*_*WoJ 5 json type-assertion typescript eslint

解析 JSON 格式的字符串时,出现 linter 错误:

let mqttMessage = JSON.parse(message.toString())

// ESLint: Unsafe assignment of an `any` value. (@typescript-eslint/no-unsafe-assignment)
Run Code Online (Sandbox Code Playgroud)

我控制了内容,message所以我想告诉TS,出来的JSON.parse()实际上是一个Object。我怎样才能做到这一点?

注意:我可以使警告静音,但我想了解是否有更好的方法来解决该问题。

dwj*_*ton 2

问题是JSON.parse返回一个any类型。

这很公平——TypeScript 不知道它是否会解析为字符串、数字或对象。

您有一个 linting 规则,规定“不允许将变量分配为任何”。

所以是的,你可以强制 JSON.parse 的结果

type SomeObjectIKnowAbout = {

}; 
const result = JSON.parse(message.toString()) as SomeObjectIKnowAbout; 
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我倾向于做的是创建一个特定的解析函数,该函数将在运行时断言 obj 确实具有您所说的形状,并且将进行类型转换,以便您可以在编写代码时处理它代码作为该对象。

type SomeObjectIKnowAbout = {
    userId: string; 
}

type ToStringable = {
    toString: () => string; 
}

function parseMessage(message: ToStringable ) : SomeObjectIKnowAbout {
    const obj = JSON.parse(message.toString()); //I'm not sure why you are parsing after toStringing tbh. 

    if (typeof obj === 'object' && obj.userId && typeof obj.userId === 'string') {
        return obj as SomeObjectIKnowAbout; 
    }
    else {
        throw new Error ("message was not a valid SomeObjectIKnowAbout"); 
    }
}


Run Code Online (Sandbox Code Playgroud)