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。我怎样才能做到这一点?
注意:我可以使警告静音,但我想了解是否有更好的方法来解决该问题。
问题是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)