ESLint:检测特定类/类型上的字符串插值

问题描述 投票:0回答:1

我使用的记录器可以接受任一字符串值,如下所示:

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
)。

有人知道这是否可能吗?谢谢!

typescript class eslint typescript-eslint
1个回答
0
投票

@alex-wayne 的评论是正确的:目前使用 ESLint 或 typescript-eslint 中的任何内置规则都是不可能的。您需要构建自定义 lint 规则。由于您尝试扫描的内容涉及检查节点的 type(以了解某物是否是记录器),因此您可能需要使用 typescript-eslint 自定义规则文档

不处理烦人的边缘情况的规则版本可以像这样工作:

  1. 查找所有具有 >0
    TemplateLiteral
    arguments
    ,它们是
    CallExpression
    的第一个子元素,其
    callee
    是具有属性
    MemberExpression
    log
  2. 检查
    MemberExpression
    对象的类型是否为
    Logger
    类的实例

请参阅自定义规则 > 类型化规则,了解如何使用 TypeScript API 获取节点的类型。

© www.soinside.com 2019 - 2024. All rights reserved.