Skip to content
Closed
Show file tree
Hide file tree
Changes from 2 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
5 changes: 5 additions & 0 deletions src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6158,6 +6158,11 @@ 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).
if (symbol.declarations && every(symbol.declarations, isParameter)) {
return { accessibility: SymbolAccessibility.Accessible };
}
Comment thread
umeshmore45 marked this conversation as resolved.
// Verify if the symbol is accessible
return hasVisibleDeclarations(symbol, shouldComputeAliasToMakeVisible) || {
accessibility: SymbolAccessibility.NotAccessible,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,8 @@ export const updateIfChanged = <T>(t: T) => {
> : ^
>update : (u: U) => T
> : ^ ^^ ^^^^^
>Object.assign(Array.isArray(u) ? [] : {}, u, { [key]: v }) : U & { [x: string]: Value<K, U>; }
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>Object.assign(Array.isArray(u) ? [] : {}, u, { [key]: v }) : U & { [key]: Value<K, U>; }
> : ^^^^^^ ^^^^^^^^^^^ ^^
>Object.assign : { <T_1 extends {}, U_1>(target: T_1, source: U_1): T_1 & U_1; <T_1 extends {}, U_1, V>(target: T_1, source1: U_1, source2: V): T_1 & U_1 & V; <T_1 extends {}, U_1, V, W>(target: T_1, source1: U_1, source2: V, source3: W): T_1 & U_1 & V & W; (target: object, ...sources: any[]): any; }
> : ^^^^^^^^^^^^^^^ ^^^^^^^ ^^ ^^ ^^ ^^^ ^^^^^^^^^^^^^^^ ^^^^^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^^^^^^^^^^^^^ ^^^^^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^ ^^^^^ ^^ ^^^ ^^^
>Object : ObjectConstructor
Expand All @@ -130,8 +130,8 @@ export const updateIfChanged = <T>(t: T) => {
> : ^^
>u : U
> : ^
>{ [key]: v } : { [x: string]: Value<K, U>; }
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>{ [key]: v } : { [key]: Value<K, U>; }
> : ^^ ^^^^^^^^^^^ ^^
>[key] : Value<K, U>
> : ^^^^^^^^^^^
>key : K
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