使用 typescript-eslint 创建自定义规则时可以访问常量值吗?

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

我正在尝试使用

@typescript-eslint/utils
添加自定义 ESLint 规则,以在
kind
的 prop
Category
与正则表达式不匹配时显示警告:

import { ESLintUtils, TSESTree } from '@typescript-eslint/utils'

const createRule = ESLintUtils.RuleCreator(() => '')

const rule = createRule({
   create(context) {
      return {
         'JSXOpeningElement[name.name="Category"] JSXAttribute[name.name="kind"]': (node: TSESTree.JSXAttribute) => {

           if (node.value?.type === 'Literal' && !/[A-Z]/.test(node.value.value)) {
              context.report({
                 node,
                 messageId: 'message'
              })
           }

      }
   },
   ...
})

如果我像前两种情况一样将 prop 作为字符串传递,上面的代码将按预期工作,但如果我传递常量,我找不到让它工作的方法。是否可以从

CATEGORY_C
访问
node
的值?

import { CATEGORY_C } from './constants'
import { Category } from './components/Category'

export const Categories () => (
   <>
      <Category kind='A' />
      <Category kind='B' />
      <Category kind={CATEGORY_C} />
   </>
)

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

是的,是的!如果您尝试访问节点的 type,则该规则需要是 类型化自定义规则

重新表述如何获取节点类型的文档中的示例:

create(context) {
  return {
    'SomeSelector'(node) {
      const services = ESLintUtils.getParserServices(context);
      const type = services.getTypeAtLocation(node);

      // ...
    },
  };
}

那个

type
是从
TypeScript Compiler API
ts.Type 检索到的
getTypeAtLocation

💡提示:您可以在 typescript-eslint.io/play 上预览节点、类型和其他规则信息。有关节点的 TypeScript 类型信息,请参阅 Types 选项卡。 这个游乐场模拟 OP 代码片段

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