8000 fix(checker): treat typeof parameter as accessible in declaration emit · microsoft/TypeScript@2ebfe78 · GitHub
[go: up one dir, main page]

Skip to content

Commit 2ebfe78

Browse files
committed
fix(checker): treat typeof parameter as accessible in declaration emit
Parameters are always in scope within their enclosing function. When `typeof paramName` is used in a return type annotation, the parameter symbol should be considered accessible regardless of method visibility (public, protected, private), just like type parameters are. Previously, `isEntityNameVisible` would fall through to `hasVisibleDeclarations` for parameter symbols, which returned `undefined` (parameters are not module-level exports), causing a false-positive TS4055/TS4073 error for protected methods using `typeof parameter` in their return type. Fixes the case: protected method(): Properties[typeof paramName] -- no longer emits TS4055
1 parent 745e209 commit 2ebfe78

File tree

4 files changed

+84
-0
lines changed

4 files changed

+84
-0
lines changed

src/compiler/checker.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6158,6 +6158,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
61586158
errorNode: firstIdentifier,
61596159
};
61606160
}
6161+
// Parameters are always in scope within their enclosing function; `typeof paramName` in a
6162+
// return type annotation is valid regardless of method visibility (public, protected, private).
6163+
if (symbol.declarations && every(symbol.declarations, isParameter)) {
6164+
return { accessibility: SymbolAccessibility.Accessible };
6165+
}
61616166
// Verify if the symbol is accessible
61626167
return hasVisibleDeclarations(symbol, shouldComputeAliasToMakeVisible) || {
61636168
accessibility: SymbolAccessibility.NotAccessible,
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
//// [tests/cases/compiler/protectedMethodTypeofParameter.d.ts] ////
2+
3+
=== protectedMethodTypeofParameter.d.ts ===
4+
export interface Properties {
5+
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.d.ts, 0, 0))
6+
7+
propertyA: number;
8+
>propertyA : Symbol(Properties.propertyA, Decl(protectedMethodTypeofParameter.d.ts, 0, 29))
9+
10+
propertyB: string;
11+
>propertyB : Symbol(Properties.propertyB, Decl(protectedMethodTypeofParameter.d.ts, 1, 22))
12+
}
13+
export declare class A {
14+
>A : Symbol(A, Decl(protectedMethodTypeofParameter.d.ts, 3, 1))
15+
16+
getPropertyValue_Ok(properties: Properties, propertyName: keyof Properties): Properties[typeof propertyName];
17+
>getPropertyValue_Ok : Symbol(A.getPropertyValue_Ok, Decl(protectedMethodTypeofParameter.d.ts, 4, 24))
18+
>properties : Symbol(properties, Decl(protectedMethodTypeofParameter.d.ts, 5, 24))
19+
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.d.ts, 0, 0))
20+
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.d.ts, 5, 47))
21+
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.d.ts, 0, 0))
22+
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.d.ts, 0, 0))
23+
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.d.ts, 5, 47))
24+
25+
protected getPropertyValue_Error(properties: Properties, propertyName: keyof Properties): Properties[typeof propertyName];
26+
>getPropertyValue_Error : Symbol(A.getPropertyValue_Error, Decl(protectedMethodTypeofParameter.d.ts, 5, 113))
27+
>properties : Symbol(properties, Decl(protectedMethodTypeofParameter.d.ts, 6, 37))
28+
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.d.ts, 0, 0))
29+
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.d.ts, 6, 60))
30+
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.d.ts, 0, 0))
31+
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.d.ts, 0, 0))
32+
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.d.ts, 6, 60))
33+
}
34+
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//// [tests/cases/compiler/protectedMethodTypeofParameter.d.ts] ////
2+
3+
=== protectedMethodTypeofParameter.d.ts ===
4+
export interface Properties {
5+
propertyA: number;
6+
>propertyA : number
7+
> : ^^^^^^
8+
9+
propertyB: string;
10+
>propertyB : string
11+
> : ^^^^^^
12+
}
13+
export declare class A {
14+
>A : A
15+
> : ^
16+
17+
getPropertyValue_Ok(properties: Properties, propertyName: keyof Properties): Properties[typeof propertyName];
18+
>getPropertyValue_Ok : (properties: Properties, propertyName: keyof Properties) => Properties[typeof propertyName]
19+
> : ^ ^^ ^^ ^^ ^^^^^
20+
>properties : Properties
21+
> : ^^^^^^^^^^
22+
>propertyName : keyof Properties
23+
> : ^^^^^^^^^^^^^^^^
24+
>propertyName : keyof Properties
25+
> : ^^^^^^^^^^^^^^^^
26+
27+
protected getPropertyValue_Error(properties: Properties, propertyName: keyof Properties): Properties[typeof propertyName];
28+
>getPropertyValue_Error : (properties: Properties, propertyName: keyof Properties) => Properties[typeof propertyName]
29+
> : ^ ^^ ^^ ^^ ^^^^^
30+
>properties : Properties
31+
> : ^^^^^^^^^^
32+
>propertyName : keyof Properties
33+
> : ^^^^^^^^^^^^^^^^
34+
>propertyName : keyof Properties
35+
> : ^^^^^^^^^^^^^^^^
36+
}
37+
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export interface Properties {
2+
propertyA: number;
3+
propertyB: string;
4+
}
5+
export declare class A {
6+
getPropertyValue_Ok(properties: Properties, propertyName: keyof Properties): Properties[typeof propertyName];
7+
protected getPropertyValue_Error(properties: Properties, propertyName: keyof Properties): Properties[typeof propertyName];
8+
}

0 commit comments

Comments
 (0)
0