Skip to content

Commit 6f43b64

Browse files
fix(declaration-emit): suppress TS4055/TS4073 for protected methods using typeof parameter
1 parent c9e7428 commit 6f43b64

5 files changed

Lines changed: 200 additions & 1 deletion

File tree

src/compiler/transformers/declarations/diagnostics.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import {
3131
getAllAccessorDeclarations,
3232
getNameOfDeclaration,
3333
getTextOfNode,
34+
hasEffectiveModifier,
3435
hasSyntacticModifier,
3536
ImportEqualsDeclaration,
3637
IndexSignatureDeclaration,
@@ -220,6 +221,9 @@ export function createGetSymbolAccessibilityDiagnosticForNodeName(node: Declarat
220221
Diagnostics.Public_static_method_0_of_exported_class_has_or_is_using_private_name_1;
221222
}
222223
else if (node.parent.kind === SyntaxKind.ClassDeclaration) {
224+
if (hasEffectiveModifier(node, ModifierFlags.Protected)) {
225+
return undefined;
226+
}
223227
return symbolAccessibilityResult.errorModuleName ?
224228
symbolAccessibilityResult.accessibility === SymbolAccessibility.CannotBeNamed ?
225229
Diagnostics.Public_method_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
@@ -353,7 +357,7 @@ export function createGetSymbolAccessibilityDiagnosticForNode(node: DeclarationD
353357
};
354358
}
355359

356-
function getReturnTypeVisibilityError(symbolAccessibilityResult: SymbolAccessibilityResult): SymbolAccessibilityDiagnostic {
360+
function getReturnTypeVisibilityError(symbolAccessibilityResult: SymbolAccessibilityResult): SymbolAccessibilityDiagnostic | undefined {
357361
let diagnosticMessage: DiagnosticMessage;
358362
switch (node.kind) {
359363
case SyntaxKind.ConstructSignature:
@@ -387,6 +391,9 @@ export function createGetSymbolAccessibilityDiagnosticForNode(node: DeclarationD
387391
Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_private_name_0;
388392
}
389393
else if (node.parent.kind === SyntaxKind.ClassDeclaration) {
394+
if (hasEffectiveModifier(node, ModifierFlags.Protected)) {
395+
return undefined;
396+
}
390397
diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
391398
symbolAccessibilityResult.accessibility === SymbolAccessibility.CannotBeNamed ?
392399
Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//// [tests/cases/compiler/protectedMethodTypeofParameter.ts] ////
2+
3+
//// [protectedMethodTypeofParameter.ts]
4+
export interface Properties {
5+
propertyA: number;
6+
propertyB: string;
7+
}
8+
9+
export class A {
10+
public getPropertyValue_Ok(
11+
properties: Properties,
12+
propertyName: keyof Properties,
13+
): Properties[typeof propertyName] {
14+
return properties[propertyName];
15+
}
16+
17+
protected getPropertyValue_Error(
18+
properties: Properties,
19+
propertyName: keyof Properties,
20+
): Properties[typeof propertyName] {
21+
return properties[propertyName];
22+
}
23+
}
24+
25+
26+
//// [protectedMethodTypeofParameter.js]
27+
export class A {
28+
getPropertyValue_Ok(properties, propertyName) {
29+
return properties[propertyName];
30+
}
31+
getPropertyValue_Error(properties, propertyName) {
32+
return properties[propertyName];
33+
}
34+
}
35+
36+
37+
//// [protectedMethodTypeofParameter.d.ts]
38+
export interface Properties {
39+
propertyA: number;
40+
propertyB: string;
41+
}
42+
export declare class A {
43+
getPropertyValue_Ok(properties: Properties, propertyName: keyof Properties): Properties[typeof propertyName];
44+
protected getPropertyValue_Error(properties: Properties, propertyName: keyof Properties): Properties[typeof propertyName];
45+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
//// [tests/cases/compiler/protectedMethodTypeofParameter.ts] ////
2+
3+
=== protectedMethodTypeofParameter.ts ===
4+
export interface Properties {
5+
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.ts, 0, 0))
6+
7+
propertyA: number;
8+
>propertyA : Symbol(Properties.propertyA, Decl(protectedMethodTypeofParameter.ts, 0, 29))
9+
10+
propertyB: string;
11+
>propertyB : Symbol(Properties.propertyB, Decl(protectedMethodTypeofParameter.ts, 1, 20))
12+
}
13+
14+
export class A {
15+
>A : Symbol(A, Decl(protectedMethodTypeofParameter.ts, 3, 1))
16+
17+
public getPropertyValue_Ok(
18+
>getPropertyValue_Ok : Symbol(A.getPropertyValue_Ok, Decl(protectedMethodTypeofParameter.ts, 5, 16))
19+
20+
properties: Properties,
21+
>properties : Symbol(properties, Decl(protectedMethodTypeofParameter.ts, 6, 29))
22+
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.ts, 0, 0))
23+
24+
propertyName: keyof Properties,
25+
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.ts, 7, 27))
26+
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.ts, 0, 0))
27+
28+
): Properties[typeof propertyName] {
29+
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.ts, 0, 0))
30+
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.ts, 7, 27))
31+
32+
return properties[propertyName];
33+
>properties : Symbol(properties, Decl(protectedMethodTypeofParameter.ts, 6, 29))
34+
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.ts, 7, 27))
35+
}
36+
37+
protected getPropertyValue_Error(
38+
>getPropertyValue_Error : Symbol(A.getPropertyValue_Error, Decl(protectedMethodTypeofParameter.ts, 11, 3))
39+
40+
properties: Properties,
41+
>properties : Symbol(properties, Decl(protectedMethodTypeofParameter.ts, 13, 35))
42+
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.ts, 0, 0))
43+
44+
propertyName: keyof Properties,
45+
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.ts, 14, 27))
46+
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.ts, 0, 0))
47+
48+
): Properties[typeof propertyName] {
49+
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.ts, 0, 0))
50+
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.ts, 14, 27))
51+
52+
return properties[propertyName];
53+
>properties : Symbol(properties, Decl(protectedMethodTypeofParameter.ts, 13, 35))
54+
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.ts, 14, 27))
55+
}
56+
}
57+
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
//// [tests/cases/compiler/protectedMethodTypeofParameter.ts] ////
2+
3+
=== protectedMethodTypeofParameter.ts ===
4+
export interface Properties {
5+
propertyA: number;
6+
>propertyA : number
7+
> : ^^^^^^
8+
9+
propertyB: string;
10+
>propertyB : string
11+
> : ^^^^^^
12+
}
13+
14+
export class A {
15+
>A : A
16+
> : ^
17+
18+
public getPropertyValue_Ok(
19+
>getPropertyValue_Ok : (properties: Properties, propertyName: keyof Properties) => Properties[typeof propertyName]
20+
> : ^ ^^ ^^ ^^ ^^^^^
21+
22+
properties: Properties,
23+
>properties : Properties
24+
> : ^^^^^^^^^^
25+
26+
propertyName: keyof Properties,
27+
>propertyName : keyof Properties
28+
> : ^^^^^^^^^^^^^^^^
29+
30+
): Properties[typeof propertyName] {
31+
>propertyName : keyof Properties
32+
> : ^^^^^^^^^^^^^^^^
33+
34+
return properties[propertyName];
35+
>properties[propertyName] : string | number
36+
> : ^^^^^^^^^^^^^^^
37+
>properties : Properties
38+
> : ^^^^^^^^^^
39+
>propertyName : keyof Properties
40+
> : ^^^^^^^^^^^^^^^^
41+
}
42+
43+
protected getPropertyValue_Error(
44+
>getPropertyValue_Error : (properties: Properties, propertyName: keyof Properties) => Properties[typeof propertyName]
45+
> : ^ ^^ ^^ ^^ ^^^^^
46+
47+
properties: Properties,
48+
>properties : Properties
49+
> : ^^^^^^^^^^
50+
51+
propertyName: keyof Properties,
52+
>propertyName : keyof Properties
53+
> : ^^^^^^^^^^^^^^^^
54+
55+
): Properties[typeof propertyName] {
56+
>propertyName : keyof Properties
57+
> : ^^^^^^^^^^^^^^^^
58+
59+
return properties[propertyName];
60+
>properties[propertyName] : string | number
61+
> : ^^^^^^^^^^^^^^^
62+
>properties : Properties
63+
> : ^^^^^^^^^^
64+
>propertyName : keyof Properties
65+
> : ^^^^^^^^^^^^^^^^
66+
}
67+
}
68+
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// @declaration: true
2+
3+
export interface Properties {
4+
propertyA: number;
5+
propertyB: string;
6+
}
7+
8+
export class A {
9+
public getPropertyValue_Ok(
10+
properties: Properties,
11+
propertyName: keyof Properties,
12+
): Properties[typeof propertyName] {
13+
return properties[propertyName];
14+
}
15+
16+
protected getPropertyValue_Error(
17+
properties: Properties,
18+
propertyName: keyof Properties,
19+
): Properties[typeof propertyName] {
20+
return properties[propertyName];
21+
}
22+
}

0 commit comments

Comments
 (0)