我使用的记录器可以接受任一字符串值,如下所示:
class Logger {
log(message: string | {message: string, context: {[key: string]: string}}) {
console.log(message)
}
}
我想要的是一个 ESLint 规则,如果在
Logger
的实例上使用插值字符串值,则会发出警告。在这种情况下,我想引导用户使用结构化上下文符号。
类似这样的:
const logger = new Logger();
const str = `some ${'literal'} string`;
// string literal is fine
logger.log('this should be fine');
// structured context object is fine
logger.log({ message: 'This should be fine', context: { foo: 'bar' } });
// this is what we want to avoid...they should use the structured context object instead
logger.log(`Something like ${'this'} is what we want to avoid`);
我正在查看
no-restricted-syntax
规则,但无法弄清楚如何在对象的 type上匹配
Identifier
(在本例中为 Logger
)。
有人知道这是否可能吗?谢谢!
@alex-wayne 的评论是正确的:目前使用 ESLint 或 typescript-eslint 中的任何内置规则都是不可能的。您需要构建自定义 lint 规则。由于您尝试扫描的内容涉及检查节点的 type(以了解某物是否是记录器),因此您可能需要使用 typescript-eslint 自定义规则文档。
不处理烦人的边缘情况的规则版本可以像这样工作:
TemplateLiteral
的 arguments
,它们是 CallExpression
的第一个子元素,其 callee
是具有属性 MemberExpression
的
log
MemberExpression
对象的类型是否为 Logger
类的实例请参阅自定义规则 > 类型化规则,了解如何使用 TypeScript API 获取节点的类型。