diff --git a/src/language/rule/abstractRule.ts b/src/language/rule/abstractRule.ts index 52b74d969a0..079a831f0d6 100644 --- a/src/language/rule/abstractRule.ts +++ b/src/language/rule/abstractRule.ts @@ -20,6 +20,8 @@ import * as ts from "typescript"; import { IWalker, WalkContext } from "../walker"; import { IOptions, IRule, IRuleMetadata, RuleFailure, RuleSeverity } from "./rule"; +export type NoInfer = T & {[K in keyof T]: T[K]}; + export abstract class AbstractRule implements IRule { public static metadata: IRuleMetadata; protected readonly ruleArguments: any[]; @@ -48,16 +50,8 @@ export abstract class AbstractRule implements IRule { } protected applyWithFunction(sourceFile: ts.SourceFile, walkFn: (ctx: WalkContext) => void): RuleFailure[]; - protected applyWithFunction( - sourceFile: ts.SourceFile, - walkFn: (ctx: WalkContext) => void, - options: U, - ): RuleFailure[]; - protected applyWithFunction( - sourceFile: ts.SourceFile, - walkFn: (ctx: WalkContext) => void, - options?: U, - ): RuleFailure[] { + protected applyWithFunction(sourceFile: ts.SourceFile, walkFn: (ctx: WalkContext) => void, options: NoInfer): RuleFailure[]; + protected applyWithFunction(sourceFile: ts.SourceFile, walkFn: (ctx: WalkContext) => void, options?: T): RuleFailure[] { const ctx = new WalkContext(sourceFile, this.ruleName, options); walkFn(ctx); return ctx.failures; diff --git a/src/rules/arrayTypeRule.ts b/src/rules/arrayTypeRule.ts index b853e50b06e..900857e1c83 100644 --- a/src/rules/arrayTypeRule.ts +++ b/src/rules/arrayTypeRule.ts @@ -52,7 +52,7 @@ export class Rule extends Lint.Rules.AbstractRule { public static FAILURE_STRING_GENERIC_SIMPLE = "Array type using 'T[]' is forbidden for non-simple types. Use 'Array' instead."; public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] { - return this.applyWithFunction(sourceFile, walk, this.ruleArguments[0]); + return this.applyWithFunction(sourceFile, walk, this.ruleArguments[0] as Option); } } diff --git a/src/rules/deprecationRule.ts b/src/rules/deprecationRule.ts index 4bc48d612c6..6ab3880cf05 100644 --- a/src/rules/deprecationRule.ts +++ b/src/rules/deprecationRule.ts @@ -44,7 +44,7 @@ export class Rule extends Lint.Rules.TypedRule { } public applyWithProgram(sourceFile: ts.SourceFile, program: ts.Program): Lint.RuleFailure[] { - return this.applyWithFunction(sourceFile, (ctx: Lint.WalkContext) => walk(ctx, program.getTypeChecker())); + return this.applyWithFunction(sourceFile, (ctx) => walk(ctx, program.getTypeChecker())); } } diff --git a/src/rules/maxLineLengthRule.ts b/src/rules/maxLineLengthRule.ts index f047978a651..af0f2c0b744 100644 --- a/src/rules/maxLineLengthRule.ts +++ b/src/rules/maxLineLengthRule.ts @@ -49,7 +49,7 @@ export class Rule extends Lint.Rules.AbstractRule { } public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] { - return this.applyWithFunction(sourceFile, walk, this.ruleArguments[0]); + return this.applyWithFunction(sourceFile, walk, this.ruleArguments[0] as number); } } diff --git a/src/rules/noFloatingPromisesRule.ts b/src/rules/noFloatingPromisesRule.ts index add6701d8cb..f7044989fb1 100644 --- a/src/rules/noFloatingPromisesRule.ts +++ b/src/rules/noFloatingPromisesRule.ts @@ -49,7 +49,7 @@ export class Rule extends Lint.Rules.TypedRule { public applyWithProgram(sourceFile: ts.SourceFile, program: ts.Program): Lint.RuleFailure[] { return this.applyWithFunction( sourceFile, - (ctx: Lint.WalkContext) => walk(ctx, program.getTypeChecker()), + (ctx) => walk(ctx, program.getTypeChecker()), ["Promise", ...this.ruleArguments as string[]], ); } diff --git a/src/rules/noUnboundMethodRule.ts b/src/rules/noUnboundMethodRule.ts index bb615de77d8..b7a5dacc070 100644 --- a/src/rules/noUnboundMethodRule.ts +++ b/src/rules/noUnboundMethodRule.ts @@ -45,7 +45,7 @@ export class Rule extends Lint.Rules.TypedRule { public static FAILURE_STRING = "Avoid referencing unbound methods which may cause unintentional scoping of 'this'."; public applyWithProgram(sourceFile: ts.SourceFile, program: ts.Program): Lint.RuleFailure[] { - return this.applyWithFunction(sourceFile, (ctx: Lint.WalkContext) => walk(ctx, program.getTypeChecker()), { + return this.applyWithFunction(sourceFile, (ctx) => walk(ctx, program.getTypeChecker()), { ignoreStatic: this.ruleArguments.indexOf(OPTION_IGNORE_STATIC) !== -1, }); } diff --git a/src/rules/noVoidExpressionRule.ts b/src/rules/noVoidExpressionRule.ts index 37def9cbeb0..598f3645c02 100644 --- a/src/rules/noVoidExpressionRule.ts +++ b/src/rules/noVoidExpressionRule.ts @@ -49,7 +49,7 @@ export class Rule extends Lint.Rules.TypedRule { public applyWithProgram(sourceFile: ts.SourceFile, program: ts.Program): Lint.RuleFailure[] { const ignoreArrowFunctionShorthand = this.ruleArguments.indexOf(OPTION_IGNORE_ARROW_FUNCTION_SHORTHAND) !== -1; - return this.applyWithFunction( + return this.applyWithFunction( sourceFile, (ctx) => walk(ctx, program.getTypeChecker()), { ignoreArrowFunctionShorthand }); } } diff --git a/src/rules/objectLiteralSortKeysRule.ts b/src/rules/objectLiteralSortKeysRule.ts index 732cb8a6d44..1cad382640c 100644 --- a/src/rules/objectLiteralSortKeysRule.ts +++ b/src/rules/objectLiteralSortKeysRule.ts @@ -77,7 +77,7 @@ export class Rule extends Lint.Rules.OptionallyTypedRule { } public applyWithProgram(sourceFile: ts.SourceFile, program: ts.Program): Lint.RuleFailure[] { - return this.applyWithFunction( + return this.applyWithFunction( sourceFile, (ctx) => walk(ctx, program.getTypeChecker()), parseOptions(this.ruleArguments), diff --git a/src/rules/promiseFunctionAsyncRule.ts b/src/rules/promiseFunctionAsyncRule.ts index e0d6535e82d..e32e5226eab 100644 --- a/src/rules/promiseFunctionAsyncRule.ts +++ b/src/rules/promiseFunctionAsyncRule.ts @@ -42,7 +42,7 @@ export class Rule extends Lint.Rules.TypedRule { public static FAILURE_STRING = "functions that return promises must be async"; public applyWithProgram(sourceFile: ts.SourceFile, program: ts.Program): Lint.RuleFailure[] { - return this.applyWithFunction(sourceFile, (ctx: Lint.WalkContext) => walk(ctx, program.getTypeChecker())); + return this.applyWithFunction(sourceFile, (ctx) => walk(ctx, program.getTypeChecker())); } } diff --git a/src/rules/strictBooleanExpressionsRule.ts b/src/rules/strictBooleanExpressionsRule.ts index f0e11b1a027..8471ca243f4 100644 --- a/src/rules/strictBooleanExpressionsRule.ts +++ b/src/rules/strictBooleanExpressionsRule.ts @@ -88,7 +88,7 @@ export class Rule extends Lint.Rules.TypedRule { public applyWithProgram(sourceFile: ts.SourceFile, program: ts.Program): Lint.RuleFailure[] { const options = parseOptions(this.ruleArguments, Lint.isStrictNullChecksEnabled(program.getCompilerOptions())); - return this.applyWithFunction(sourceFile, (ctx: Lint.WalkContext) => walk(ctx, program.getTypeChecker()), options); + return this.applyWithFunction(sourceFile, (ctx) => walk(ctx, program.getTypeChecker()), options); } }