diff --git a/baselines/packages/mimir/test/no-inferred-empty-object/default/test.ts.lint b/baselines/packages/mimir/test/no-inferred-empty-object/default/test.ts.lint index c233c5961..be05fc8b0 100644 --- a/baselines/packages/mimir/test/no-inferred-empty-object/default/test.ts.lint +++ b/baselines/packages/mimir/test/no-inferred-empty-object/default/test.ts.lint @@ -244,3 +244,18 @@ new Promise((resolve, reject) => { } }); }); + +declare function myTagFn(parts: TemplateStringsArray, ...values: T[]): string; +declare function myOtherTag(parts: TemplateStringsArray): T; + +myTagFn``; +~~~~~~~~~ [error no-inferred-empty-object: TypeParameter 'T' is inferred as '{}'. Consider adding type arguments to the call.] +myTagFn`${''}`; +myTagFn`${1}`; +myTagFn`${1}${''}`; +myTagFn`${1}${''}`; + +myOtherTag``; +~~~~~~~~~~~~ [error no-inferred-empty-object: TypeParameter 'T' is inferred as '{}'. Consider adding type arguments to the call.] +myOtherTag`${''}`; +myOtherTag``; diff --git a/baselines/packages/mimir/test/no-inferred-empty-object/pre290/test.ts.lint b/baselines/packages/mimir/test/no-inferred-empty-object/pre290/test.ts.lint index 059a8141f..5a2a5b046 100644 --- a/baselines/packages/mimir/test/no-inferred-empty-object/pre290/test.ts.lint +++ b/baselines/packages/mimir/test/no-inferred-empty-object/pre290/test.ts.lint @@ -243,3 +243,16 @@ new Promise((resolve, reject) => { } }); }); + +declare function myTagFn(parts: TemplateStringsArray, ...values: T[]): string; +declare function myOtherTag(parts: TemplateStringsArray): T; + +myTagFn``; +myTagFn`${''}`; +myTagFn`${1}`; +myTagFn`${1}${''}`; +myTagFn`${1}${''}`; + +myOtherTag``; +myOtherTag`${''}`; +myOtherTag``; diff --git a/packages/mimir/src/rules/no-inferred-empty-object.ts b/packages/mimir/src/rules/no-inferred-empty-object.ts index 5bb60d0bd..83aa7bce3 100644 --- a/packages/mimir/src/rules/no-inferred-empty-object.ts +++ b/packages/mimir/src/rules/no-inferred-empty-object.ts @@ -18,8 +18,12 @@ export class Rule extends TypedRule { } else if (node.kind === ts.SyntaxKind.NewExpression) { if ((node).typeArguments === undefined) this.checkNewExpression(node); - } else if (!typescriptPre290 && // passing type arguments to JSX elements is only possible starting from typescript@2.9.0 - (node.kind === ts.SyntaxKind.JsxOpeningElement || node.kind === ts.SyntaxKind.JsxSelfClosingElement) && + } else if (!typescriptPre290 && // type arguments on JSX elements and tagged templates was introduced in typescript@2.9.0 + ( + node.kind === ts.SyntaxKind.JsxOpeningElement || + node.kind === ts.SyntaxKind.JsxSelfClosingElement || + node.kind === ts.SyntaxKind.TaggedTemplateExpression + ) && // TODO fix assertion on upgrade to typescript@2.9 (node).typeArguments === undefined) { this.checkCallExpression(node); @@ -27,7 +31,7 @@ export class Rule extends TypedRule { } } - private checkCallExpression(node: ts.CallExpression | ts.JsxOpeningLikeElement) { + private checkCallExpression(node: ts.CallExpression | ts.JsxOpeningLikeElement | ts.TaggedTemplateExpression) { const signature = this.checker.getResolvedSignature(node); // wotan-disable-next-line no-useless-predicate if (signature.declaration !== undefined) { diff --git a/packages/mimir/test/no-inferred-empty-object/test.ts b/packages/mimir/test/no-inferred-empty-object/test.ts index e73e6e579..3124d8305 100644 --- a/packages/mimir/test/no-inferred-empty-object/test.ts +++ b/packages/mimir/test/no-inferred-empty-object/test.ts @@ -212,3 +212,16 @@ new Promise((resolve, reject) => { } }); }); + +declare function myTagFn(parts: TemplateStringsArray, ...values: T[]): string; +declare function myOtherTag(parts: TemplateStringsArray): T; + +myTagFn``; +myTagFn`${''}`; +myTagFn`${1}`; +myTagFn`${1}${''}`; +myTagFn`${1}${''}`; + +myOtherTag``; +myOtherTag`${''}`; +myOtherTag``;