diff --git a/internal/checker/checker.go b/internal/checker/checker.go index 397ad9cbef..02bdfe89ee 100644 --- a/internal/checker/checker.go +++ b/internal/checker/checker.go @@ -6691,11 +6691,11 @@ func (c *Checker) checkUnusedIdentifiers(potentiallyUnusedIdentifiers []*ast.Nod c.checkUnusedLocalsAndParameters(node) case ast.KindConstructor, ast.KindFunctionExpression, ast.KindFunctionDeclaration, ast.KindArrowFunction, ast.KindMethodDeclaration, ast.KindGetAccessor, ast.KindSetAccessor: - // Only report unused parameters on the implementation, not overloads. + // Only report unused parameters and type parameters on the implementation, not overloads. if node.Body() != nil { c.checkUnusedLocalsAndParameters(node) + c.checkUnusedTypeParameters(node) } - c.checkUnusedTypeParameters(node) case ast.KindMethodSignature, ast.KindCallSignature, ast.KindConstructSignature, ast.KindFunctionType, ast.KindConstructorType, ast.KindTypeAliasDeclaration, ast.KindJSTypeAliasDeclaration, ast.KindInterfaceDeclaration: c.checkUnusedTypeParameters(node) diff --git a/testdata/baselines/reference/compiler/overloadUnusedTypeParameters.errors.txt b/testdata/baselines/reference/compiler/overloadUnusedTypeParameters.errors.txt new file mode 100644 index 0000000000..7ec712aa10 --- /dev/null +++ b/testdata/baselines/reference/compiler/overloadUnusedTypeParameters.errors.txt @@ -0,0 +1,24 @@ +overloadUnusedTypeParameters.ts(3,30): error TS6196: 'T' is declared but never used. +overloadUnusedTypeParameters.ts(13,31): error TS6196: 'T' is declared but never used. + + +==== overloadUnusedTypeParameters.ts (2 errors) ==== + export function tryParseJson(text: string): unknown; + export function tryParseJson(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; + export function tryParseJson() { + ~ +!!! error TS6196: 'T' is declared but never used. + throw new Error("noop") + } + + export function tryParseJson2(text: string): unknown; + export function tryParseJson2(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; + export function tryParseJson2() { + throw new Error("noop") + } + + export function tryParseJson3(_text: string): unknown { + ~ +!!! error TS6196: 'T' is declared but never used. + throw new Error("noop") + } \ No newline at end of file diff --git a/testdata/baselines/reference/compiler/overloadUnusedTypeParameters.js b/testdata/baselines/reference/compiler/overloadUnusedTypeParameters.js new file mode 100644 index 0000000000..1272294238 --- /dev/null +++ b/testdata/baselines/reference/compiler/overloadUnusedTypeParameters.js @@ -0,0 +1,29 @@ +//// [tests/cases/compiler/overloadUnusedTypeParameters.ts] //// + +//// [overloadUnusedTypeParameters.ts] +export function tryParseJson(text: string): unknown; +export function tryParseJson(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; +export function tryParseJson() { + throw new Error("noop") +} + +export function tryParseJson2(text: string): unknown; +export function tryParseJson2(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; +export function tryParseJson2() { + throw new Error("noop") +} + +export function tryParseJson3(_text: string): unknown { + throw new Error("noop") +} + +//// [overloadUnusedTypeParameters.js] +export function tryParseJson() { + throw new Error("noop"); +} +export function tryParseJson2() { + throw new Error("noop"); +} +export function tryParseJson3(_text) { + throw new Error("noop"); +} diff --git a/testdata/baselines/reference/compiler/overloadUnusedTypeParameters.symbols b/testdata/baselines/reference/compiler/overloadUnusedTypeParameters.symbols new file mode 100644 index 0000000000..b8f65bead4 --- /dev/null +++ b/testdata/baselines/reference/compiler/overloadUnusedTypeParameters.symbols @@ -0,0 +1,56 @@ +//// [tests/cases/compiler/overloadUnusedTypeParameters.ts] //// + +=== overloadUnusedTypeParameters.ts === +export function tryParseJson(text: string): unknown; +>tryParseJson : Symbol(tryParseJson, Decl(overloadUnusedTypeParameters.ts, 0, 0), Decl(overloadUnusedTypeParameters.ts, 0, 55), Decl(overloadUnusedTypeParameters.ts, 1, 106)) +>T : Symbol(T, Decl(overloadUnusedTypeParameters.ts, 0, 29)) +>text : Symbol(text, Decl(overloadUnusedTypeParameters.ts, 0, 32)) + +export function tryParseJson(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; +>tryParseJson : Symbol(tryParseJson, Decl(overloadUnusedTypeParameters.ts, 0, 0), Decl(overloadUnusedTypeParameters.ts, 0, 55), Decl(overloadUnusedTypeParameters.ts, 1, 106)) +>T : Symbol(T, Decl(overloadUnusedTypeParameters.ts, 1, 29)) +>text : Symbol(text, Decl(overloadUnusedTypeParameters.ts, 1, 32)) +>predicate : Symbol(predicate, Decl(overloadUnusedTypeParameters.ts, 1, 45)) +>parsed : Symbol(parsed, Decl(overloadUnusedTypeParameters.ts, 1, 58)) +>parsed : Symbol(parsed, Decl(overloadUnusedTypeParameters.ts, 1, 58)) +>T : Symbol(T, Decl(overloadUnusedTypeParameters.ts, 1, 29)) +>T : Symbol(T, Decl(overloadUnusedTypeParameters.ts, 1, 29)) + +export function tryParseJson() { +>tryParseJson : Symbol(tryParseJson, Decl(overloadUnusedTypeParameters.ts, 0, 0), Decl(overloadUnusedTypeParameters.ts, 0, 55), Decl(overloadUnusedTypeParameters.ts, 1, 106)) +>T : Symbol(T, Decl(overloadUnusedTypeParameters.ts, 2, 29)) + + throw new Error("noop") +>Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2022.error.d.ts, --, --)) +} + +export function tryParseJson2(text: string): unknown; +>tryParseJson2 : Symbol(tryParseJson2, Decl(overloadUnusedTypeParameters.ts, 4, 1), Decl(overloadUnusedTypeParameters.ts, 6, 56), Decl(overloadUnusedTypeParameters.ts, 7, 107)) +>T : Symbol(T, Decl(overloadUnusedTypeParameters.ts, 6, 30)) +>text : Symbol(text, Decl(overloadUnusedTypeParameters.ts, 6, 33)) + +export function tryParseJson2(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; +>tryParseJson2 : Symbol(tryParseJson2, Decl(overloadUnusedTypeParameters.ts, 4, 1), Decl(overloadUnusedTypeParameters.ts, 6, 56), Decl(overloadUnusedTypeParameters.ts, 7, 107)) +>T : Symbol(T, Decl(overloadUnusedTypeParameters.ts, 7, 30)) +>text : Symbol(text, Decl(overloadUnusedTypeParameters.ts, 7, 33)) +>predicate : Symbol(predicate, Decl(overloadUnusedTypeParameters.ts, 7, 46)) +>parsed : Symbol(parsed, Decl(overloadUnusedTypeParameters.ts, 7, 59)) +>parsed : Symbol(parsed, Decl(overloadUnusedTypeParameters.ts, 7, 59)) +>T : Symbol(T, Decl(overloadUnusedTypeParameters.ts, 7, 30)) +>T : Symbol(T, Decl(overloadUnusedTypeParameters.ts, 7, 30)) + +export function tryParseJson2() { +>tryParseJson2 : Symbol(tryParseJson2, Decl(overloadUnusedTypeParameters.ts, 4, 1), Decl(overloadUnusedTypeParameters.ts, 6, 56), Decl(overloadUnusedTypeParameters.ts, 7, 107)) + + throw new Error("noop") +>Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2022.error.d.ts, --, --)) +} + +export function tryParseJson3(_text: string): unknown { +>tryParseJson3 : Symbol(tryParseJson3, Decl(overloadUnusedTypeParameters.ts, 10, 1)) +>T : Symbol(T, Decl(overloadUnusedTypeParameters.ts, 12, 30)) +>_text : Symbol(_text, Decl(overloadUnusedTypeParameters.ts, 12, 33)) + + throw new Error("noop") +>Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2022.error.d.ts, --, --)) +} diff --git a/testdata/baselines/reference/compiler/overloadUnusedTypeParameters.types b/testdata/baselines/reference/compiler/overloadUnusedTypeParameters.types new file mode 100644 index 0000000000..3fa0ccdee1 --- /dev/null +++ b/testdata/baselines/reference/compiler/overloadUnusedTypeParameters.types @@ -0,0 +1,50 @@ +//// [tests/cases/compiler/overloadUnusedTypeParameters.ts] //// + +=== overloadUnusedTypeParameters.ts === +export function tryParseJson(text: string): unknown; +>tryParseJson : { (text: string): unknown; (text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; } +>text : string + +export function tryParseJson(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; +>tryParseJson : { (text: string): unknown; (text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; } +>text : string +>predicate : (parsed: unknown) => parsed is T +>parsed : unknown + +export function tryParseJson() { +>tryParseJson : { (text: string): unknown; (text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; } + + throw new Error("noop") +>new Error("noop") : Error +>Error : ErrorConstructor +>"noop" : "noop" +} + +export function tryParseJson2(text: string): unknown; +>tryParseJson2 : { (text: string): unknown; (text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; } +>text : string + +export function tryParseJson2(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; +>tryParseJson2 : { (text: string): unknown; (text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; } +>text : string +>predicate : (parsed: unknown) => parsed is T +>parsed : unknown + +export function tryParseJson2() { +>tryParseJson2 : { (text: string): unknown; (text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; } + + throw new Error("noop") +>new Error("noop") : Error +>Error : ErrorConstructor +>"noop" : "noop" +} + +export function tryParseJson3(_text: string): unknown { +>tryParseJson3 : (_text: string) => unknown +>_text : string + + throw new Error("noop") +>new Error("noop") : Error +>Error : ErrorConstructor +>"noop" : "noop" +} diff --git a/testdata/tests/cases/compiler/overloadUnusedTypeParameters.ts b/testdata/tests/cases/compiler/overloadUnusedTypeParameters.ts new file mode 100644 index 0000000000..8847bf4811 --- /dev/null +++ b/testdata/tests/cases/compiler/overloadUnusedTypeParameters.ts @@ -0,0 +1,20 @@ +// @strict: true +// @noUnusedLocals: true +// @noUnusedParameters: true +// @target: esnext + +export function tryParseJson(text: string): unknown; +export function tryParseJson(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; +export function tryParseJson() { + throw new Error("noop") +} + +export function tryParseJson2(text: string): unknown; +export function tryParseJson2(text: string, predicate: (parsed: unknown) => parsed is T): T | undefined; +export function tryParseJson2() { + throw new Error("noop") +} + +export function tryParseJson3(_text: string): unknown { + throw new Error("noop") +} \ No newline at end of file