Merge pull request #24645 from Kingwl/this-type-accessibility

allow access protected member in this parameter context
This commit is contained in:
Mohamed Hegazy 2018-06-11 13:17:58 -07:00 committed by GitHub
commit 35d25ff280
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 622 additions and 4 deletions

View File

@ -17122,20 +17122,28 @@ namespace ts {
// Find the first enclosing class that has the declaring classes of the protected constituents
// of the property as base classes
const enclosingClass = forEachEnclosingClass(node, enclosingDeclaration => {
let enclosingClass = forEachEnclosingClass(node, enclosingDeclaration => {
const enclosingClass = <InterfaceType>getDeclaredTypeOfSymbol(getSymbolOfNode(enclosingDeclaration)!);
return isClassDerivedFromDeclaringClasses(enclosingClass, prop) ? enclosingClass : undefined;
});
// A protected property is accessible if the property is within the declaring class or classes derived from it
if (!enclosingClass) {
error(errorNode, Diagnostics.Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses, symbolToString(prop), typeToString(getDeclaringClass(prop) || type));
return false;
// allow PropertyAccessibility if context is in function with this parameter
// static member access is disallow
let thisParameter: ParameterDeclaration | undefined;
if (flags & ModifierFlags.Static || !(thisParameter = getThisParameterFromNodeContext(node)) || !thisParameter.type) {
error(errorNode, Diagnostics.Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses, symbolToString(prop), typeToString(getDeclaringClass(prop) || type));
return false;
}
const thisType = getTypeFromTypeNode(thisParameter.type);
enclosingClass = ((thisType.flags & TypeFlags.TypeParameter) ? getConstraintFromTypeParameter(<TypeParameter>thisType) : thisType) as InterfaceType;
}
// No further restrictions for static properties
if (flags & ModifierFlags.Static) {
return true;
}
if (type.flags & TypeFlags.TypeParameter) {
if (type.flags & TypeFlags.TypeParameter) {
// get the original type -- represented as the type constraint of the 'this' type
type = (type as TypeParameter).isThisType ? getConstraintOfTypeParameter(<TypeParameter>type)! : getBaseConstraintOfType(<TypeParameter>type)!; // TODO: GH#18217 Use a different variable that's allowed to be undefined
}
@ -17146,6 +17154,11 @@ namespace ts {
return true;
}
function getThisParameterFromNodeContext (node: Node) {
const thisContainer = getThisContainer(node, /* includeArrowFunctions */ false);
return thisContainer && isFunctionLike(thisContainer) ? getThisParameter(thisContainer) : undefined;
}
function symbolHasNonMethodDeclaration(symbol: Symbol) {
return forEachProperty(symbol, prop => {
const propKind = getDeclarationKindFromSymbol(prop);

View File

@ -0,0 +1,74 @@
tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(17,10): error TS2341: Property 'p' is private and only accessible within class 'MyClass'.
tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(20,13): error TS2341: Property 'sp' is private and only accessible within class 'MyClass'.
tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(21,13): error TS2445: Property 'spp' is protected and only accessible within class 'MyClass' and its subclasses.
tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(26,10): error TS2341: Property 'p' is private and only accessible within class 'MyClass'.
tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(29,13): error TS2341: Property 'sp' is private and only accessible within class 'MyClass'.
tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(30,13): error TS2445: Property 'spp' is protected and only accessible within class 'MyClass' and its subclasses.
tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(35,10): error TS2341: Property 'p' is private and only accessible within class 'MyClass'.
tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(38,13): error TS2341: Property 'sp' is private and only accessible within class 'MyClass'.
tests/cases/conformance/types/thisType/thisTypeAccessibility.ts(39,13): error TS2445: Property 'spp' is protected and only accessible within class 'MyClass' and its subclasses.
==== tests/cases/conformance/types/thisType/thisTypeAccessibility.ts (9 errors) ====
class MyClass {
private p: number = 123;
protected pp: number = 123;
public ppp: number = 123;
private static sp: number = 123;
protected static spp: number = 123;
public static sppp: number = 123;
}
interface MyClass {
extension1(p: number): void;
extension2(p: number): void;
extension3(p: number): void;
}
MyClass.prototype.extension1 = function (this: MyClass, p: number) {
this.p = p;
~
!!! error TS2341: Property 'p' is private and only accessible within class 'MyClass'.
this.pp = p;
this.ppp = p;
MyClass.sp = p;
~~
!!! error TS2341: Property 'sp' is private and only accessible within class 'MyClass'.
MyClass.spp = p;
~~~
!!! error TS2445: Property 'spp' is protected and only accessible within class 'MyClass' and its subclasses.
MyClass.sppp = p;
}
MyClass.prototype.extension2 = function<T extends MyClass> (this: T, p: number) {
this.p = p;
~
!!! error TS2341: Property 'p' is private and only accessible within class 'MyClass'.
this.pp = p;
this.ppp = p;
MyClass.sp = p;
~~
!!! error TS2341: Property 'sp' is private and only accessible within class 'MyClass'.
MyClass.spp = p;
~~~
!!! error TS2445: Property 'spp' is protected and only accessible within class 'MyClass' and its subclasses.
MyClass.sppp = p;
}
function extension3<T extends MyClass> (this: T, p: number) {
this.p = p;
~
!!! error TS2341: Property 'p' is private and only accessible within class 'MyClass'.
this.pp = p;
this.ppp = p;
MyClass.sp = p;
~~
!!! error TS2341: Property 'sp' is private and only accessible within class 'MyClass'.
MyClass.spp = p;
~~~
!!! error TS2445: Property 'spp' is protected and only accessible within class 'MyClass' and its subclasses.
MyClass.sppp = p;
}
MyClass.prototype.extension3 = extension3;

View File

@ -0,0 +1,83 @@
//// [thisTypeAccessibility.ts]
class MyClass {
private p: number = 123;
protected pp: number = 123;
public ppp: number = 123;
private static sp: number = 123;
protected static spp: number = 123;
public static sppp: number = 123;
}
interface MyClass {
extension1(p: number): void;
extension2(p: number): void;
extension3(p: number): void;
}
MyClass.prototype.extension1 = function (this: MyClass, p: number) {
this.p = p;
this.pp = p;
this.ppp = p;
MyClass.sp = p;
MyClass.spp = p;
MyClass.sppp = p;
}
MyClass.prototype.extension2 = function<T extends MyClass> (this: T, p: number) {
this.p = p;
this.pp = p;
this.ppp = p;
MyClass.sp = p;
MyClass.spp = p;
MyClass.sppp = p;
}
function extension3<T extends MyClass> (this: T, p: number) {
this.p = p;
this.pp = p;
this.ppp = p;
MyClass.sp = p;
MyClass.spp = p;
MyClass.sppp = p;
}
MyClass.prototype.extension3 = extension3;
//// [thisTypeAccessibility.js]
var MyClass = /** @class */ (function () {
function MyClass() {
this.p = 123;
this.pp = 123;
this.ppp = 123;
}
MyClass.sp = 123;
MyClass.spp = 123;
MyClass.sppp = 123;
return MyClass;
}());
MyClass.prototype.extension1 = function (p) {
this.p = p;
this.pp = p;
this.ppp = p;
MyClass.sp = p;
MyClass.spp = p;
MyClass.sppp = p;
};
MyClass.prototype.extension2 = function (p) {
this.p = p;
this.pp = p;
this.ppp = p;
MyClass.sp = p;
MyClass.spp = p;
MyClass.sppp = p;
};
function extension3(p) {
this.p = p;
this.pp = p;
this.ppp = p;
MyClass.sp = p;
MyClass.spp = p;
MyClass.sppp = p;
}
MyClass.prototype.extension3 = extension3;

View File

@ -0,0 +1,188 @@
=== tests/cases/conformance/types/thisType/thisTypeAccessibility.ts ===
class MyClass {
>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1))
private p: number = 123;
>p : Symbol(MyClass.p, Decl(thisTypeAccessibility.ts, 0, 15))
protected pp: number = 123;
>pp : Symbol(MyClass.pp, Decl(thisTypeAccessibility.ts, 1, 28))
public ppp: number = 123;
>ppp : Symbol(MyClass.ppp, Decl(thisTypeAccessibility.ts, 2, 31))
private static sp: number = 123;
>sp : Symbol(MyClass.sp, Decl(thisTypeAccessibility.ts, 3, 29))
protected static spp: number = 123;
>spp : Symbol(MyClass.spp, Decl(thisTypeAccessibility.ts, 4, 36))
public static sppp: number = 123;
>sppp : Symbol(MyClass.sppp, Decl(thisTypeAccessibility.ts, 5, 39))
}
interface MyClass {
>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1))
extension1(p: number): void;
>extension1 : Symbol(MyClass.extension1, Decl(thisTypeAccessibility.ts, 9, 19))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 10, 15))
extension2(p: number): void;
>extension2 : Symbol(MyClass.extension2, Decl(thisTypeAccessibility.ts, 10, 32))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 11, 15))
extension3(p: number): void;
>extension3 : Symbol(MyClass.extension3, Decl(thisTypeAccessibility.ts, 11, 32))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 12, 15))
}
MyClass.prototype.extension1 = function (this: MyClass, p: number) {
>MyClass.prototype.extension1 : Symbol(MyClass.extension1, Decl(thisTypeAccessibility.ts, 9, 19))
>MyClass.prototype : Symbol(MyClass.prototype)
>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1))
>prototype : Symbol(MyClass.prototype)
>extension1 : Symbol(MyClass.extension1, Decl(thisTypeAccessibility.ts, 9, 19))
>this : Symbol(this, Decl(thisTypeAccessibility.ts, 15, 41))
>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 15, 55))
this.p = p;
>this.p : Symbol(MyClass.p, Decl(thisTypeAccessibility.ts, 0, 15))
>this : Symbol(this, Decl(thisTypeAccessibility.ts, 15, 41))
>p : Symbol(MyClass.p, Decl(thisTypeAccessibility.ts, 0, 15))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 15, 55))
this.pp = p;
>this.pp : Symbol(MyClass.pp, Decl(thisTypeAccessibility.ts, 1, 28))
>this : Symbol(this, Decl(thisTypeAccessibility.ts, 15, 41))
>pp : Symbol(MyClass.pp, Decl(thisTypeAccessibility.ts, 1, 28))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 15, 55))
this.ppp = p;
>this.ppp : Symbol(MyClass.ppp, Decl(thisTypeAccessibility.ts, 2, 31))
>this : Symbol(this, Decl(thisTypeAccessibility.ts, 15, 41))
>ppp : Symbol(MyClass.ppp, Decl(thisTypeAccessibility.ts, 2, 31))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 15, 55))
MyClass.sp = p;
>MyClass.sp : Symbol(MyClass.sp, Decl(thisTypeAccessibility.ts, 3, 29))
>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1))
>sp : Symbol(MyClass.sp, Decl(thisTypeAccessibility.ts, 3, 29))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 15, 55))
MyClass.spp = p;
>MyClass.spp : Symbol(MyClass.spp, Decl(thisTypeAccessibility.ts, 4, 36))
>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1))
>spp : Symbol(MyClass.spp, Decl(thisTypeAccessibility.ts, 4, 36))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 15, 55))
MyClass.sppp = p;
>MyClass.sppp : Symbol(MyClass.sppp, Decl(thisTypeAccessibility.ts, 5, 39))
>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1))
>sppp : Symbol(MyClass.sppp, Decl(thisTypeAccessibility.ts, 5, 39))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 15, 55))
}
MyClass.prototype.extension2 = function<T extends MyClass> (this: T, p: number) {
>MyClass.prototype.extension2 : Symbol(MyClass.extension2, Decl(thisTypeAccessibility.ts, 10, 32))
>MyClass.prototype : Symbol(MyClass.prototype)
>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1))
>prototype : Symbol(MyClass.prototype)
>extension2 : Symbol(MyClass.extension2, Decl(thisTypeAccessibility.ts, 10, 32))
>T : Symbol(T, Decl(thisTypeAccessibility.ts, 24, 40))
>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1))
>this : Symbol(this, Decl(thisTypeAccessibility.ts, 24, 60))
>T : Symbol(T, Decl(thisTypeAccessibility.ts, 24, 40))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 24, 68))
this.p = p;
>this.p : Symbol(MyClass.p, Decl(thisTypeAccessibility.ts, 0, 15))
>this : Symbol(this, Decl(thisTypeAccessibility.ts, 24, 60))
>p : Symbol(MyClass.p, Decl(thisTypeAccessibility.ts, 0, 15))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 24, 68))
this.pp = p;
>this.pp : Symbol(MyClass.pp, Decl(thisTypeAccessibility.ts, 1, 28))
>this : Symbol(this, Decl(thisTypeAccessibility.ts, 24, 60))
>pp : Symbol(MyClass.pp, Decl(thisTypeAccessibility.ts, 1, 28))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 24, 68))
this.ppp = p;
>this.ppp : Symbol(MyClass.ppp, Decl(thisTypeAccessibility.ts, 2, 31))
>this : Symbol(this, Decl(thisTypeAccessibility.ts, 24, 60))
>ppp : Symbol(MyClass.ppp, Decl(thisTypeAccessibility.ts, 2, 31))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 24, 68))
MyClass.sp = p;
>MyClass.sp : Symbol(MyClass.sp, Decl(thisTypeAccessibility.ts, 3, 29))
>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1))
>sp : Symbol(MyClass.sp, Decl(thisTypeAccessibility.ts, 3, 29))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 24, 68))
MyClass.spp = p;
>MyClass.spp : Symbol(MyClass.spp, Decl(thisTypeAccessibility.ts, 4, 36))
>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1))
>spp : Symbol(MyClass.spp, Decl(thisTypeAccessibility.ts, 4, 36))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 24, 68))
MyClass.sppp = p;
>MyClass.sppp : Symbol(MyClass.sppp, Decl(thisTypeAccessibility.ts, 5, 39))
>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1))
>sppp : Symbol(MyClass.sppp, Decl(thisTypeAccessibility.ts, 5, 39))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 24, 68))
}
function extension3<T extends MyClass> (this: T, p: number) {
>extension3 : Symbol(extension3, Decl(thisTypeAccessibility.ts, 31, 1))
>T : Symbol(T, Decl(thisTypeAccessibility.ts, 33, 20))
>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1))
>this : Symbol(this, Decl(thisTypeAccessibility.ts, 33, 40))
>T : Symbol(T, Decl(thisTypeAccessibility.ts, 33, 20))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 33, 48))
this.p = p;
>this.p : Symbol(MyClass.p, Decl(thisTypeAccessibility.ts, 0, 15))
>this : Symbol(this, Decl(thisTypeAccessibility.ts, 33, 40))
>p : Symbol(MyClass.p, Decl(thisTypeAccessibility.ts, 0, 15))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 33, 48))
this.pp = p;
>this.pp : Symbol(MyClass.pp, Decl(thisTypeAccessibility.ts, 1, 28))
>this : Symbol(this, Decl(thisTypeAccessibility.ts, 33, 40))
>pp : Symbol(MyClass.pp, Decl(thisTypeAccessibility.ts, 1, 28))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 33, 48))
this.ppp = p;
>this.ppp : Symbol(MyClass.ppp, Decl(thisTypeAccessibility.ts, 2, 31))
>this : Symbol(this, Decl(thisTypeAccessibility.ts, 33, 40))
>ppp : Symbol(MyClass.ppp, Decl(thisTypeAccessibility.ts, 2, 31))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 33, 48))
MyClass.sp = p;
>MyClass.sp : Symbol(MyClass.sp, Decl(thisTypeAccessibility.ts, 3, 29))
>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1))
>sp : Symbol(MyClass.sp, Decl(thisTypeAccessibility.ts, 3, 29))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 33, 48))
MyClass.spp = p;
>MyClass.spp : Symbol(MyClass.spp, Decl(thisTypeAccessibility.ts, 4, 36))
>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1))
>spp : Symbol(MyClass.spp, Decl(thisTypeAccessibility.ts, 4, 36))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 33, 48))
MyClass.sppp = p;
>MyClass.sppp : Symbol(MyClass.sppp, Decl(thisTypeAccessibility.ts, 5, 39))
>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1))
>sppp : Symbol(MyClass.sppp, Decl(thisTypeAccessibility.ts, 5, 39))
>p : Symbol(p, Decl(thisTypeAccessibility.ts, 33, 48))
}
MyClass.prototype.extension3 = extension3;
>MyClass.prototype.extension3 : Symbol(MyClass.extension3, Decl(thisTypeAccessibility.ts, 11, 32))
>MyClass.prototype : Symbol(MyClass.prototype)
>MyClass : Symbol(MyClass, Decl(thisTypeAccessibility.ts, 0, 0), Decl(thisTypeAccessibility.ts, 7, 1))
>prototype : Symbol(MyClass.prototype)
>extension3 : Symbol(MyClass.extension3, Decl(thisTypeAccessibility.ts, 11, 32))
>extension3 : Symbol(extension3, Decl(thisTypeAccessibility.ts, 31, 1))

View File

@ -0,0 +1,217 @@
=== tests/cases/conformance/types/thisType/thisTypeAccessibility.ts ===
class MyClass {
>MyClass : MyClass
private p: number = 123;
>p : number
>123 : 123
protected pp: number = 123;
>pp : number
>123 : 123
public ppp: number = 123;
>ppp : number
>123 : 123
private static sp: number = 123;
>sp : number
>123 : 123
protected static spp: number = 123;
>spp : number
>123 : 123
public static sppp: number = 123;
>sppp : number
>123 : 123
}
interface MyClass {
>MyClass : MyClass
extension1(p: number): void;
>extension1 : (p: number) => void
>p : number
extension2(p: number): void;
>extension2 : (p: number) => void
>p : number
extension3(p: number): void;
>extension3 : (p: number) => void
>p : number
}
MyClass.prototype.extension1 = function (this: MyClass, p: number) {
>MyClass.prototype.extension1 = function (this: MyClass, p: number) { this.p = p; this.pp = p; this.ppp = p; MyClass.sp = p; MyClass.spp = p; MyClass.sppp = p;} : (this: MyClass, p: number) => void
>MyClass.prototype.extension1 : (p: number) => void
>MyClass.prototype : MyClass
>MyClass : typeof MyClass
>prototype : MyClass
>extension1 : (p: number) => void
>function (this: MyClass, p: number) { this.p = p; this.pp = p; this.ppp = p; MyClass.sp = p; MyClass.spp = p; MyClass.sppp = p;} : (this: MyClass, p: number) => void
>this : MyClass
>MyClass : MyClass
>p : number
this.p = p;
>this.p = p : number
>this.p : number
>this : MyClass
>p : number
>p : number
this.pp = p;
>this.pp = p : number
>this.pp : number
>this : MyClass
>pp : number
>p : number
this.ppp = p;
>this.ppp = p : number
>this.ppp : number
>this : MyClass
>ppp : number
>p : number
MyClass.sp = p;
>MyClass.sp = p : number
>MyClass.sp : number
>MyClass : typeof MyClass
>sp : number
>p : number
MyClass.spp = p;
>MyClass.spp = p : number
>MyClass.spp : number
>MyClass : typeof MyClass
>spp : number
>p : number
MyClass.sppp = p;
>MyClass.sppp = p : number
>MyClass.sppp : number
>MyClass : typeof MyClass
>sppp : number
>p : number
}
MyClass.prototype.extension2 = function<T extends MyClass> (this: T, p: number) {
>MyClass.prototype.extension2 = function<T extends MyClass> (this: T, p: number) { this.p = p; this.pp = p; this.ppp = p; MyClass.sp = p; MyClass.spp = p; MyClass.sppp = p;} : <T extends MyClass>(this: T, p: number) => void
>MyClass.prototype.extension2 : (p: number) => void
>MyClass.prototype : MyClass
>MyClass : typeof MyClass
>prototype : MyClass
>extension2 : (p: number) => void
>function<T extends MyClass> (this: T, p: number) { this.p = p; this.pp = p; this.ppp = p; MyClass.sp = p; MyClass.spp = p; MyClass.sppp = p;} : <T extends MyClass>(this: T, p: number) => void
>T : T
>MyClass : MyClass
>this : T
>T : T
>p : number
this.p = p;
>this.p = p : number
>this.p : number
>this : T
>p : number
>p : number
this.pp = p;
>this.pp = p : number
>this.pp : number
>this : T
>pp : number
>p : number
this.ppp = p;
>this.ppp = p : number
>this.ppp : number
>this : T
>ppp : number
>p : number
MyClass.sp = p;
>MyClass.sp = p : number
>MyClass.sp : number
>MyClass : typeof MyClass
>sp : number
>p : number
MyClass.spp = p;
>MyClass.spp = p : number
>MyClass.spp : number
>MyClass : typeof MyClass
>spp : number
>p : number
MyClass.sppp = p;
>MyClass.sppp = p : number
>MyClass.sppp : number
>MyClass : typeof MyClass
>sppp : number
>p : number
}
function extension3<T extends MyClass> (this: T, p: number) {
>extension3 : <T extends MyClass>(this: T, p: number) => void
>T : T
>MyClass : MyClass
>this : T
>T : T
>p : number
this.p = p;
>this.p = p : number
>this.p : number
>this : T
>p : number
>p : number
this.pp = p;
>this.pp = p : number
>this.pp : number
>this : T
>pp : number
>p : number
this.ppp = p;
>this.ppp = p : number
>this.ppp : number
>this : T
>ppp : number
>p : number
MyClass.sp = p;
>MyClass.sp = p : number
>MyClass.sp : number
>MyClass : typeof MyClass
>sp : number
>p : number
MyClass.spp = p;
>MyClass.spp = p : number
>MyClass.spp : number
>MyClass : typeof MyClass
>spp : number
>p : number
MyClass.sppp = p;
>MyClass.sppp = p : number
>MyClass.sppp : number
>MyClass : typeof MyClass
>sppp : number
>p : number
}
MyClass.prototype.extension3 = extension3;
>MyClass.prototype.extension3 = extension3 : <T extends MyClass>(this: T, p: number) => void
>MyClass.prototype.extension3 : (p: number) => void
>MyClass.prototype : MyClass
>MyClass : typeof MyClass
>prototype : MyClass
>extension3 : (p: number) => void
>extension3 : <T extends MyClass>(this: T, p: number) => void

View File

@ -0,0 +1,43 @@
class MyClass {
private p: number = 123;
protected pp: number = 123;
public ppp: number = 123;
private static sp: number = 123;
protected static spp: number = 123;
public static sppp: number = 123;
}
interface MyClass {
extension1(p: number): void;
extension2(p: number): void;
extension3(p: number): void;
}
MyClass.prototype.extension1 = function (this: MyClass, p: number) {
this.p = p;
this.pp = p;
this.ppp = p;
MyClass.sp = p;
MyClass.spp = p;
MyClass.sppp = p;
}
MyClass.prototype.extension2 = function<T extends MyClass> (this: T, p: number) {
this.p = p;
this.pp = p;
this.ppp = p;
MyClass.sp = p;
MyClass.spp = p;
MyClass.sppp = p;
}
function extension3<T extends MyClass> (this: T, p: number) {
this.p = p;
this.pp = p;
this.ppp = p;
MyClass.sp = p;
MyClass.spp = p;
MyClass.sppp = p;
}
MyClass.prototype.extension3 = extension3;