Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6158,6 +6158,14 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
errorNode: firstIdentifier,
};
}
// Parameters are always in scope within their enclosing function; `typeof paramName` in a
// return type annotation is valid regardless of method visibility (public, protected, private).
// Narrow this exception to TypeQuery nodes only (e.g. `typeof param`) so that parameter
// identifiers used as computed property names in type printing are not incorrectly treated
// as accessible unique-symbol-like keys.
if (symbol.declarations && every(symbol.declarations, isParameter) && isPartOfTypeQuery(entityName)) {
return { accessibility: SymbolAccessibility.Accessible };
}
// Verify if the symbol is accessible
return hasVisibleDeclarations(symbol, shouldComputeAliasToMakeVisible) || {
accessibility: SymbolAccessibility.NotAccessible,
Expand Down
44 changes: 44 additions & 0 deletions tests/baselines/reference/protectedMethodTypeofParameter.d.symbols
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
//// [tests/cases/compiler/protectedMethodTypeofParameter.d.ts] ////

=== protectedMethodTypeofParameter.d.ts ===
export interface Properties {
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.d.ts, 0, 0))

propertyA: number;
>propertyA : Symbol(Properties.propertyA, Decl(protectedMethodTypeofParameter.d.ts, 0, 29))

propertyB: string;
>propertyB : Symbol(Properties.propertyB, Decl(protectedMethodTypeofParameter.d.ts, 1, 22))
}
export declare class A {
>A : Symbol(A, Decl(protectedMethodTypeofParameter.d.ts, 3, 1))

getPropertyValue_Ok(properties: Properties, propertyName: keyof Properties): Properties[typeof propertyName];
>getPropertyValue_Ok : Symbol(A.getPropertyValue_Ok, Decl(protectedMethodTypeofParameter.d.ts, 4, 24))
>properties : Symbol(properties, Decl(protectedMethodTypeofParameter.d.ts, 5, 24))
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.d.ts, 0, 0))
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.d.ts, 5, 47))
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.d.ts, 0, 0))
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.d.ts, 0, 0))
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.d.ts, 5, 47))

protected getPropertyValue_Protected(properties: Properties, propertyName: keyof Properties): Properties[typeof propertyName];
>getPropertyValue_Protected : Symbol(A.getPropertyValue_Protected, Decl(protectedMethodTypeofParameter.d.ts, 5, 113))
>properties : Symbol(properties, Decl(protectedMethodTypeofParameter.d.ts, 6, 41))
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.d.ts, 0, 0))
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.d.ts, 6, 64))
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.d.ts, 0, 0))
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.d.ts, 0, 0))
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.d.ts, 6, 64))

protected setPropertyValue_Protected(properties: Properties, propertyName: keyof Properties, propertyValue: Properties[typeof propertyName]): void;
>setPropertyValue_Protected : Symbol(A.setPropertyValue_Protected, Decl(protectedMethodTypeofParameter.d.ts, 6, 130))
>properties : Symbol(properties, Decl(protectedMethodTypeofParameter.d.ts, 7, 41))
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.d.ts, 0, 0))
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.d.ts, 7, 64))
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.d.ts, 0, 0))
>propertyValue : Symbol(propertyValue, Decl(protectedMethodTypeofParameter.d.ts, 7, 96))
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.d.ts, 0, 0))
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.d.ts, 7, 64))
}

49 changes: 49 additions & 0 deletions tests/baselines/reference/protectedMethodTypeofParameter.d.types
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
//// [tests/cases/compiler/protectedMethodTypeofParameter.d.ts] ////

=== protectedMethodTypeofParameter.d.ts ===
export interface Properties {
propertyA: number;
>propertyA : number
> : ^^^^^^

propertyB: string;
>propertyB : string
> : ^^^^^^
}
export declare class A {
>A : A
> : ^

getPropertyValue_Ok(properties: Properties, propertyName: keyof Properties): Properties[typeof propertyName];
>getPropertyValue_Ok : (properties: Properties, propertyName: keyof Properties) => Properties[typeof propertyName]
> : ^ ^^ ^^ ^^ ^^^^^
>properties : Properties
> : ^^^^^^^^^^
>propertyName : keyof Properties
> : ^^^^^^^^^^^^^^^^
>propertyName : keyof Properties
> : ^^^^^^^^^^^^^^^^

protected getPropertyValue_Protected(properties: Properties, propertyName: keyof Properties): Properties[typeof propertyName];
>getPropertyValue_Protected : (properties: Properties, propertyName: keyof Properties) => Properties[typeof propertyName]
> : ^ ^^ ^^ ^^ ^^^^^
>properties : Properties
> : ^^^^^^^^^^
>propertyName : keyof Properties
> : ^^^^^^^^^^^^^^^^
>propertyName : keyof Properties
> : ^^^^^^^^^^^^^^^^

protected setPropertyValue_Protected(properties: Properties, propertyName: keyof Properties, propertyValue: Properties[typeof propertyName]): void;
>setPropertyValue_Protected : (properties: Properties, propertyName: keyof Properties, propertyValue: Properties[typeof propertyName]) => void
> : ^ ^^ ^^ ^^ ^^ ^^ ^^^^^
>properties : Properties
> : ^^^^^^^^^^
>propertyName : keyof Properties
> : ^^^^^^^^^^^^^^^^
>propertyValue : string | number
> : ^^^^^^^^^^^^^^^
>propertyName : keyof Properties
> : ^^^^^^^^^^^^^^^^
}

61 changes: 61 additions & 0 deletions tests/baselines/reference/protectedMethodTypeofParameter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
//// [tests/cases/compiler/protectedMethodTypeofParameter.ts] ////

//// [protectedMethodTypeofParameter.ts]
export interface Properties {
propertyA: number;
propertyB: string;
}

export class A {
public getPropertyValue_Ok(
properties: Properties,
propertyName: keyof Properties,
): Properties[typeof propertyName] {
return properties[propertyName];
}

protected getPropertyValue_Protected(
properties: Properties,
propertyName: keyof Properties,
): Properties[typeof propertyName] {
return properties[propertyName];
}

protected setPropertyValue_Protected(
properties: Properties,
propertyName: keyof Properties,
propertyValue: Properties[typeof propertyName],
): void {
void properties;
void propertyName;
void propertyValue;
}
}


//// [protectedMethodTypeofParameter.js]
export class A {
getPropertyValue_Ok(properties, propertyName) {
return properties[propertyName];
}
getPropertyValue_Protected(properties, propertyName) {
return properties[propertyName];
}
setPropertyValue_Protected(properties, propertyName, propertyValue) {
void properties;
void propertyName;
void propertyValue;
}
}


//// [protectedMethodTypeofParameter.d.ts]
export interface Properties {
propertyA: number;
propertyB: string;
}
export declare class A {
getPropertyValue_Ok(properties: Properties, propertyName: keyof Properties): Properties[typeof propertyName];
protected getPropertyValue_Protected(properties: Properties, propertyName: keyof Properties): Properties[typeof propertyName];
protected setPropertyValue_Protected(properties: Properties, propertyName: keyof Properties, propertyValue: Properties[typeof propertyName]): void;
}
84 changes: 84 additions & 0 deletions tests/baselines/reference/protectedMethodTypeofParameter.symbols
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
//// [tests/cases/compiler/protectedMethodTypeofParameter.ts] ////

=== protectedMethodTypeofParameter.ts ===
export interface Properties {
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.ts, 0, 0))

propertyA: number;
>propertyA : Symbol(Properties.propertyA, Decl(protectedMethodTypeofParameter.ts, 0, 29))

propertyB: string;
>propertyB : Symbol(Properties.propertyB, Decl(protectedMethodTypeofParameter.ts, 1, 20))
}

export class A {
>A : Symbol(A, Decl(protectedMethodTypeofParameter.ts, 3, 1))

public getPropertyValue_Ok(
>getPropertyValue_Ok : Symbol(A.getPropertyValue_Ok, Decl(protectedMethodTypeofParameter.ts, 5, 16))

properties: Properties,
>properties : Symbol(properties, Decl(protectedMethodTypeofParameter.ts, 6, 29))
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.ts, 0, 0))

propertyName: keyof Properties,
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.ts, 7, 27))
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.ts, 0, 0))

): Properties[typeof propertyName] {
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.ts, 0, 0))
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.ts, 7, 27))

return properties[propertyName];
>properties : Symbol(properties, Decl(protectedMethodTypeofParameter.ts, 6, 29))
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.ts, 7, 27))
}

protected getPropertyValue_Protected(
>getPropertyValue_Protected : Symbol(A.getPropertyValue_Protected, Decl(protectedMethodTypeofParameter.ts, 11, 3))

properties: Properties,
>properties : Symbol(properties, Decl(protectedMethodTypeofParameter.ts, 13, 39))
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.ts, 0, 0))

propertyName: keyof Properties,
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.ts, 14, 27))
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.ts, 0, 0))

): Properties[typeof propertyName] {
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.ts, 0, 0))
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.ts, 14, 27))

return properties[propertyName];
>properties : Symbol(properties, Decl(protectedMethodTypeofParameter.ts, 13, 39))
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.ts, 14, 27))
}

protected setPropertyValue_Protected(
>setPropertyValue_Protected : Symbol(A.setPropertyValue_Protected, Decl(protectedMethodTypeofParameter.ts, 18, 3))

properties: Properties,
>properties : Symbol(properties, Decl(protectedMethodTypeofParameter.ts, 20, 39))
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.ts, 0, 0))

propertyName: keyof Properties,
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.ts, 21, 27))
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.ts, 0, 0))

propertyValue: Properties[typeof propertyName],
>propertyValue : Symbol(propertyValue, Decl(protectedMethodTypeofParameter.ts, 22, 35))
>Properties : Symbol(Properties, Decl(protectedMethodTypeofParameter.ts, 0, 0))
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.ts, 21, 27))

): void {
void properties;
>properties : Symbol(properties, Decl(protectedMethodTypeofParameter.ts, 20, 39))

void propertyName;
>propertyName : Symbol(propertyName, Decl(protectedMethodTypeofParameter.ts, 21, 27))

void propertyValue;
>propertyValue : Symbol(propertyValue, Decl(protectedMethodTypeofParameter.ts, 22, 35))
}
}

106 changes: 106 additions & 0 deletions tests/baselines/reference/protectedMethodTypeofParameter.types
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
//// [tests/cases/compiler/protectedMethodTypeofParameter.ts] ////

=== protectedMethodTypeofParameter.ts ===
export interface Properties {
propertyA: number;
>propertyA : number
> : ^^^^^^

propertyB: string;
>propertyB : string
> : ^^^^^^
}

export class A {
>A : A
> : ^

public getPropertyValue_Ok(
>getPropertyValue_Ok : (properties: Properties, propertyName: keyof Properties) => Properties[typeof propertyName]
> : ^ ^^ ^^ ^^ ^^^^^

properties: Properties,
>properties : Properties
> : ^^^^^^^^^^

propertyName: keyof Properties,
>propertyName : keyof Properties
> : ^^^^^^^^^^^^^^^^

): Properties[typeof propertyName] {
>propertyName : keyof Properties
> : ^^^^^^^^^^^^^^^^

return properties[propertyName];
>properties[propertyName] : string | number
> : ^^^^^^^^^^^^^^^
>properties : Properties
> : ^^^^^^^^^^
>propertyName : keyof Properties
> : ^^^^^^^^^^^^^^^^
}

protected getPropertyValue_Protected(
>getPropertyValue_Protected : (properties: Properties, propertyName: keyof Properties) => Properties[typeof propertyName]
> : ^ ^^ ^^ ^^ ^^^^^

properties: Properties,
>properties : Properties
> : ^^^^^^^^^^

propertyName: keyof Properties,
>propertyName : keyof Properties
> : ^^^^^^^^^^^^^^^^

): Properties[typeof propertyName] {
>propertyName : keyof Properties
> : ^^^^^^^^^^^^^^^^

return properties[propertyName];
>properties[propertyName] : string | number
> : ^^^^^^^^^^^^^^^
>properties : Properties
> : ^^^^^^^^^^
>propertyName : keyof Properties
> : ^^^^^^^^^^^^^^^^
}

protected setPropertyValue_Protected(
>setPropertyValue_Protected : (properties: Properties, propertyName: keyof Properties, propertyValue: Properties[typeof propertyName]) => void
> : ^ ^^ ^^ ^^ ^^ ^^ ^^^^^

properties: Properties,
>properties : Properties
> : ^^^^^^^^^^

propertyName: keyof Properties,
>propertyName : keyof Properties
> : ^^^^^^^^^^^^^^^^

propertyValue: Properties[typeof propertyName],
>propertyValue : string | number
> : ^^^^^^^^^^^^^^^
>propertyName : keyof Properties
> : ^^^^^^^^^^^^^^^^

): void {
void properties;
>void properties : undefined
> : ^^^^^^^^^
>properties : Properties
> : ^^^^^^^^^^

void propertyName;
>void propertyName : undefined
> : ^^^^^^^^^
>propertyName : keyof Properties
> : ^^^^^^^^^^^^^^^^

void propertyValue;
>void propertyValue : undefined
> : ^^^^^^^^^
>propertyValue : string | number
> : ^^^^^^^^^^^^^^^
}
}

9 changes: 9 additions & 0 deletions tests/cases/compiler/protectedMethodTypeofParameter.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export interface Properties {
propertyA: number;
propertyB: string;
}
export declare class A {
getPropertyValue_Ok(properties: Properties, propertyName: keyof Properties): Properties[typeof propertyName];
protected getPropertyValue_Protected(properties: Properties, propertyName: keyof Properties): Properties[typeof propertyName];
protected setPropertyValue_Protected(properties: Properties, propertyName: keyof Properties, propertyValue: Properties[typeof propertyName]): void;
}
Loading
Loading