我正在尝试编写一个自定义的typescript-eslint规则,其中我需要确保节点的被调用方对象具有特定的Type,这里我将其称为MyType
。所以我使用的是typescript-eslint的CallExpression,如下面的代码所示
源代码:
interface MyType {
...
}
const someVariable: MyType = ...;
自定义typescript-eslint规则:
export const rule = createRule({
name: 'some-name',
meta: {
type: 'problem',
docs: {
description: 'description',
recommended: 'error',
},
schema: [],
messages,
},
defaultOptions: [],
create: (context) => {
return {
CallExpression(node: TSESTree.CallExpression) {
const services = ESLintUtils.getParserServices(context);
const checker = services.program.getTypeChecker();
const callee = node.callee;
const object = callee.type === 'MemberExpression' ? callee.object : null;
if (object === null) {
return;
}
const type = checker.getTypeAtLocation(services.esTreeNodeToTSNodeMap.get(object));
const isMyType = (
object.type === 'Identifier' &&
(type as any)?.symbol?.escapedName === 'MyType'
);
if (isMyType) {
[... do stuff here]
}
},
};
},
});
然而,我的问题是符号或escapedName未定义,因此它不等于'MyType'。有没有更好的方法来检查被调用方的对象是否属于特定类型?
1条答案
按热度按时间e4yzc0pl1#
根据评论,这个问题可以完全在TS模板文字中解决,而不需要ESLint规则。对于无效的调用,错误也会出现在编译时。TS模板文字允许TS理解可静态分析的字符串的构造。
这里的一个限制是第一个参数必须直接提供,即它不能通过由其他字符串组成的变量来构造。但这也适用于埃斯林特的方式。