TSLint是否支持将特定文件中的导入列入黑名单?如果是,我该如何配置?
答案 0 :(得分:2)
我认为没有默认规则可以实现这一目标。但是TSLint可以使用自定义规则进行扩展。这是有关如何创建,包括和使用自定义规则https://palantir.github.io/tslint/develop/custom-rules/的很好的教程。
我们可以从现有import-blacklist
规则开始并进行扩展。原始来源位于importBlacklistRule.ts
我们只需要扩展选项以包括文件名并检查文件名即可。这里是完整的清单:
import * as Path from "path";
import * as Lint from "tslint";
import { findImports, ImportKind } from "tsutils";
import * as TS from "typescript";
interface Options {
imports: string[];
files: string[];
}
export class Rule extends Lint.Rules.AbstractRule {
public static FAILURE_STRING =
"This import is blacklisted, import a submodule instead";
public apply(sourceFile: TS.SourceFile): Lint.RuleFailure[] {
return this.applyWithFunction(sourceFile, walk, this
.ruleArguments[0] as Options);
}
}
const walk = (ctx: Lint.WalkContext<Options>) => {
if (ctx.options.files === undefined || ctx.options.imports === undefined) {
return;
}
const fileName = Path.basename(ctx.sourceFile.fileName); // Strip off path
if (ctx.options.files.indexOf(fileName) === -1) {
// Could be extended to test for a regex.
return;
}
for (const name of findImports(ctx.sourceFile, ImportKind.All)) {
if (ctx.options.imports.indexOf(name.text) !== -1) {
ctx.addFailure(
name.getStart(ctx.sourceFile) + 1,
name.end - 1,
Rule.FAILURE_STRING
);
}
}
};
在上面的示例中,我将import-blacklist
规则简化为基本内容,并添加了文件名检查。
const fileName = Path.basename(ctx.sourceFile.fileName); // Strip off path
if (ctx.options.files.indexOf(fileName) === -1) {
// Could be extended to test for a regex.
return;
}
在此示例中,我们仅检查options.files
中是否必须包含不带路径的文件名。您可以扩展此逻辑以检查正则表达式或满足您需求的任何东西。
在包含此规则的同时,您必须指定要检查的文件名和禁止的导入。
"custom-import-blacklist": [
true,
{
"files": ["Index.ts"],
"imports": ["xxx"]
}
]