我正在尝试使用
@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} />
</>
)
是的,是的!如果您尝试访问节点的 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 代码片段。