Skip to content

Commit fe4a96e

Browse files
committed
Allow static side of native types to be extended
1 parent 8c7fd3c commit fe4a96e

File tree

46 files changed

+207
-167
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+207
-167
lines changed

src/lib/core.d.ts

+63-23
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,7 @@ interface Object {
109109
propertyIsEnumerable(v: string): boolean;
110110
}
111111

112-
/**
113-
* Provides functionality common to all JavaScript objects.
114-
*/
115-
declare var Object: {
112+
interface ObjectConstructor {
116113
new (value?: any): Object;
117114
(): any;
118115
(value: any): any;
@@ -206,6 +203,11 @@ declare var Object: {
206203
keys(o: any): string[];
207204
}
208205

206+
/**
207+
* Provides functionality common to all JavaScript objects.
208+
*/
209+
declare var Object: ObjectConstructor;
210+
209211
/**
210212
* Creates a new function.
211213
*/
@@ -240,8 +242,8 @@ interface Function {
240242
caller: Function;
241243
}
242244

243-
declare var Function: {
244-
/**
245+
interface FunctionConstructor {
246+
/**
245247
* Creates a new function.
246248
* @param args A list of arguments the function accepts.
247249
*/
@@ -250,6 +252,8 @@ declare var Function: {
250252
prototype: Function;
251253
}
252254

255+
declare var Function: FunctionConstructor;
256+
253257
interface IArguments {
254258
[index: number]: any;
255259
length: number;
@@ -409,24 +413,29 @@ interface String {
409413
[index: number]: string;
410414
}
411415

412-
/**
413-
* Allows manipulation and formatting of text strings and determination and location of substrings within strings.
414-
*/
415-
declare var String: {
416+
interface StringConstructor {
416417
new (value?: any): String;
417418
(value?: any): string;
418419
prototype: String;
419420
fromCharCode(...codes: number[]): string;
420421
}
421422

423+
/**
424+
* Allows manipulation and formatting of text strings and determination and location of substrings within strings.
425+
*/
426+
declare var String: StringConstructor;
427+
422428
interface Boolean {
423429
}
424-
declare var Boolean: {
430+
431+
interface BoolenConstructor {
425432
new (value?: any): Boolean;
426433
(value?: any): boolean;
427434
prototype: Boolean;
428435
}
429436

437+
declare var Boolean: BoolenConstructor;
438+
430439
interface Number {
431440
/**
432441
* Returns a string representation of an object.
@@ -453,8 +462,7 @@ interface Number {
453462
toPrecision(precision?: number): string;
454463
}
455464

456-
/** An object that represents a number of any kind. All JavaScript numbers are 64-bit floating-point numbers. */
457-
declare var Number: {
465+
interface NumberConstructor {
458466
new (value?: any): Number;
459467
(value?: any): number;
460468
prototype: Number;
@@ -484,6 +492,9 @@ declare var Number: {
484492
POSITIVE_INFINITY: number;
485493
}
486494

495+
/** An object that represents a number of any kind. All JavaScript numbers are 64-bit floating-point numbers. */
496+
declare var Number: NumberConstructor;
497+
487498
interface Math {
488499
/** The mathematical constant e. This is Euler's number, the base of natural logarithms. */
489500
E: number;
@@ -749,7 +760,7 @@ interface Date {
749760
toJSON(key?: any): string;
750761
}
751762

752-
declare var Date: {
763+
interface DateConstructor {
753764
new (): Date;
754765
new (value: number): Date;
755766
new (value: string): Date;
@@ -775,6 +786,8 @@ declare var Date: {
775786
now(): number;
776787
}
777788

789+
declare var Date: DateConstructor;
790+
778791
interface RegExpMatchArray extends Array<string> {
779792
index?: number;
780793
input?: string;
@@ -815,7 +828,8 @@ interface RegExp {
815828
// Non-standard extensions
816829
compile(): RegExp;
817830
}
818-
declare var RegExp: {
831+
832+
interface RegExpConstructor {
819833
new (pattern: string, flags?: string): RegExp;
820834
(pattern: string, flags?: string): RegExp;
821835

@@ -832,64 +846,87 @@ declare var RegExp: {
832846
lastMatch: string;
833847
}
834848

849+
declare var RegExp: RegExpConstructor;
850+
835851
interface Error {
836852
name: string;
837853
message: string;
838854
}
839-
declare var Error: {
855+
856+
interface ErrorConstructor {
840857
new (message?: string): Error;
841858
(message?: string): Error;
842859
prototype: Error;
843860
}
844861

862+
declare var Error: ErrorConstructor;
863+
845864
interface EvalError extends Error {
846865
}
847-
declare var EvalError: {
866+
867+
interface EvalErrorConstructor {
848868
new (message?: string): EvalError;
849869
(message?: string): EvalError;
850870
prototype: EvalError;
851871
}
852872

873+
declare var EvalError: EvalErrorConstructor;
874+
853875
interface RangeError extends Error {
854876
}
855-
declare var RangeError: {
877+
878+
interface RangeErrorConstructor {
856879
new (message?: string): RangeError;
857880
(message?: string): RangeError;
858881
prototype: RangeError;
859882
}
860883

884+
declare var RangeError: RangeErrorConstructor;
885+
861886
interface ReferenceError extends Error {
862887
}
863-
declare var ReferenceError: {
888+
889+
interface ReferenceErrorConstructor {
864890
new (message?: string): ReferenceError;
865891
(message?: string): ReferenceError;
866892
prototype: ReferenceError;
867893
}
868894

895+
declare var ReferenceError: ReferenceErrorConstructor;
896+
869897
interface SyntaxError extends Error {
870898
}
871-
declare var SyntaxError: {
899+
900+
interface SyntaxErrorConstructor {
872901
new (message?: string): SyntaxError;
873902
(message?: string): SyntaxError;
874903
prototype: SyntaxError;
875904
}
876905

906+
declare var SyntaxError: SyntaxErrorConstructor;
907+
877908
interface TypeError extends Error {
878909
}
879-
declare var TypeError: {
910+
911+
interface TypeErrorConstructor {
880912
new (message?: string): TypeError;
881913
(message?: string): TypeError;
882914
prototype: TypeError;
883915
}
884916

917+
declare var TypeError: TypeErrorConstructor;
918+
885919
interface URIError extends Error {
886920
}
887-
declare var URIError: {
921+
922+
interface URIErrorConstructor {
888923
new (message?: string): URIError;
889924
(message?: string): URIError;
890925
prototype: URIError;
891926
}
892927

928+
declare var URIError: URIErrorConstructor;
929+
893930
interface JSON {
894931
/**
895932
* Converts a JavaScript Object Notation (JSON) string into an object.
@@ -1092,7 +1129,8 @@ interface Array<T> {
10921129

10931130
[n: number]: T;
10941131
}
1095-
declare var Array: {
1132+
1133+
interface ArrayConstructor {
10961134
new (arrayLength?: number): any[];
10971135
new <T>(arrayLength: number): T[];
10981136
new <T>(...items: T[]): T[];
@@ -1102,3 +1140,5 @@ declare var Array: {
11021140
isArray(arg: any): boolean;
11031141
prototype: Array<any>;
11041142
}
1143+
1144+
declare var Array: ArrayConstructor;

tests/baselines/reference/ExportVariableOfGenericTypeWithInaccessibleTypeAsTypeArgument.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@ module A {
1717
export var beez2 = new Array<B>();
1818
>beez2 : B[]
1919
>new Array<B>() : B[]
20-
>Array : { (arrayLength?: number): any[]; <T>(arrayLength: number): T[]; <T>(...items: T[]): T[]; new (arrayLength?: number): any[]; new <T>(arrayLength: number): T[]; new <T>(...items: T[]): T[]; isArray(arg: any): boolean; prototype: any[]; }
20+
>Array : ArrayConstructor
2121
>B : B
2222
}

tests/baselines/reference/arrayConcat2.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ a.concat('Hello');
1818
var b = new Array<string>();
1919
>b : string[]
2020
>new Array<string>() : string[]
21-
>Array : { (arrayLength?: number): any[]; <T>(arrayLength: number): T[]; <T>(...items: T[]): T[]; new (arrayLength?: number): any[]; new <T>(arrayLength: number): T[]; new <T>(...items: T[]): T[]; isArray(arg: any): boolean; prototype: any[]; }
21+
>Array : ArrayConstructor
2222

2323
b.concat('hello');
2424
>b.concat('hello') : string[]

tests/baselines/reference/arrayConstructors1.types

+6-6
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,19 @@ x = new Array(1);
66
>x = new Array(1) : any[]
77
>x : string[]
88
>new Array(1) : any[]
9-
>Array : { (arrayLength?: number): any[]; <T>(arrayLength: number): T[]; <T>(...items: T[]): T[]; new (arrayLength?: number): any[]; new <T>(arrayLength: number): T[]; new <T>(...items: T[]): T[]; isArray(arg: any): boolean; prototype: any[]; }
9+
>Array : ArrayConstructor
1010

1111
x = new Array('hi', 'bye');
1212
>x = new Array('hi', 'bye') : string[]
1313
>x : string[]
1414
>new Array('hi', 'bye') : string[]
15-
>Array : { (arrayLength?: number): any[]; <T>(arrayLength: number): T[]; <T>(...items: T[]): T[]; new (arrayLength?: number): any[]; new <T>(arrayLength: number): T[]; new <T>(...items: T[]): T[]; isArray(arg: any): boolean; prototype: any[]; }
15+
>Array : ArrayConstructor
1616

1717
x = new Array<string>('hi', 'bye');
1818
>x = new Array<string>('hi', 'bye') : string[]
1919
>x : string[]
2020
>new Array<string>('hi', 'bye') : string[]
21-
>Array : { (arrayLength?: number): any[]; <T>(arrayLength: number): T[]; <T>(...items: T[]): T[]; new (arrayLength?: number): any[]; new <T>(arrayLength: number): T[]; new <T>(...items: T[]): T[]; isArray(arg: any): boolean; prototype: any[]; }
21+
>Array : ArrayConstructor
2222

2323
var y: number[];
2424
>y : number[]
@@ -27,17 +27,17 @@ y = new Array(1);
2727
>y = new Array(1) : any[]
2828
>y : number[]
2929
>new Array(1) : any[]
30-
>Array : { (arrayLength?: number): any[]; <T>(arrayLength: number): T[]; <T>(...items: T[]): T[]; new (arrayLength?: number): any[]; new <T>(arrayLength: number): T[]; new <T>(...items: T[]): T[]; isArray(arg: any): boolean; prototype: any[]; }
30+
>Array : ArrayConstructor
3131

3232
y = new Array(1,2);
3333
>y = new Array(1,2) : number[]
3434
>y : number[]
3535
>new Array(1,2) : number[]
36-
>Array : { (arrayLength?: number): any[]; <T>(arrayLength: number): T[]; <T>(...items: T[]): T[]; new (arrayLength?: number): any[]; new <T>(arrayLength: number): T[]; new <T>(...items: T[]): T[]; isArray(arg: any): boolean; prototype: any[]; }
36+
>Array : ArrayConstructor
3737

3838
y = new Array<number>(1, 2);
3939
>y = new Array<number>(1, 2) : number[]
4040
>y : number[]
4141
>new Array<number>(1, 2) : number[]
42-
>Array : { (arrayLength?: number): any[]; <T>(arrayLength: number): T[]; <T>(...items: T[]): T[]; new (arrayLength?: number): any[]; new <T>(arrayLength: number): T[]; new <T>(...items: T[]): T[]; isArray(arg: any): boolean; prototype: any[]; }
42+
>Array : ArrayConstructor
4343

tests/baselines/reference/arrayLiteral.types

+4-4
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ var x = [];
88
var x = new Array(1);
99
>x : any[]
1010
>new Array(1) : any[]
11-
>Array : { (arrayLength?: number): any[]; <T>(arrayLength: number): T[]; <T>(...items: T[]): T[]; new (arrayLength?: number): any[]; new <T>(arrayLength: number): T[]; new <T>(...items: T[]): T[]; isArray(arg: any): boolean; prototype: any[]; }
11+
>Array : ArrayConstructor
1212

1313
var y = [1];
1414
>y : number[]
@@ -21,7 +21,7 @@ var y = [1, 2];
2121
var y = new Array<number>();
2222
>y : number[]
2323
>new Array<number>() : number[]
24-
>Array : { (arrayLength?: number): any[]; <T>(arrayLength: number): T[]; <T>(...items: T[]): T[]; new (arrayLength?: number): any[]; new <T>(arrayLength: number): T[]; new <T>(...items: T[]): T[]; isArray(arg: any): boolean; prototype: any[]; }
24+
>Array : ArrayConstructor
2525

2626
var x2: number[] = [];
2727
>x2 : number[]
@@ -30,7 +30,7 @@ var x2: number[] = [];
3030
var x2: number[] = new Array(1);
3131
>x2 : number[]
3232
>new Array(1) : any[]
33-
>Array : { (arrayLength?: number): any[]; <T>(arrayLength: number): T[]; <T>(...items: T[]): T[]; new (arrayLength?: number): any[]; new <T>(arrayLength: number): T[]; new <T>(...items: T[]): T[]; isArray(arg: any): boolean; prototype: any[]; }
33+
>Array : ArrayConstructor
3434

3535
var y2: number[] = [1];
3636
>y2 : number[]
@@ -43,5 +43,5 @@ var y2: number[] = [1, 2];
4343
var y2: number[] = new Array<number>();
4444
>y2 : number[]
4545
>new Array<number>() : number[]
46-
>Array : { (arrayLength?: number): any[]; <T>(arrayLength: number): T[]; <T>(...items: T[]): T[]; new (arrayLength?: number): any[]; new <T>(arrayLength: number): T[]; new <T>(...items: T[]): T[]; isArray(arg: any): boolean; prototype: any[]; }
46+
>Array : ArrayConstructor
4747

tests/baselines/reference/arrayTypeOfTypeOf.errors.txt

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayTypeOfTypeOf.ts(
22
tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayTypeOfTypeOf.ts(6,30): error TS1109: Expression expected.
33
tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayTypeOfTypeOf.ts(7,22): error TS1005: '=' expected.
44
tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayTypeOfTypeOf.ts(7,32): error TS1109: Expression expected.
5-
tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayTypeOfTypeOf.ts(6,5): error TS2323: Type 'number' is not assignable to type '{ (arrayLength?: number): any[]; <T>(arrayLength: number): T[]; <T>(...items: T[]): T[]; new (arrayLength?: number): any[]; new <T>(arrayLength: number): T[]; new <T>(...items: T[]): T[]; isArray(arg: any): boolean; prototype: any[]; }'.
5+
tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayTypeOfTypeOf.ts(6,5): error TS2323: Type 'number' is not assignable to type 'ArrayConstructor'.
66
Property 'isArray' is missing in type 'Number'.
7-
tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayTypeOfTypeOf.ts(7,5): error TS2323: Type 'number' is not assignable to type '{ (arrayLength?: number): any[]; <T>(arrayLength: number): T[]; <T>(...items: T[]): T[]; new (arrayLength?: number): any[]; new <T>(arrayLength: number): T[]; new <T>(...items: T[]): T[]; isArray(arg: any): boolean; prototype: any[]; }'.
7+
tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayTypeOfTypeOf.ts(7,5): error TS2323: Type 'number' is not assignable to type 'ArrayConstructor'.
88

99

1010
==== tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayTypeOfTypeOf.ts (6 errors) ====
@@ -19,12 +19,12 @@ tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayTypeOfTypeOf.ts(
1919
~
2020
!!! error TS1109: Expression expected.
2121
~~~
22-
!!! error TS2323: Type 'number' is not assignable to type '{ (arrayLength?: number): any[]; <T>(arrayLength: number): T[]; <T>(...items: T[]): T[]; new (arrayLength?: number): any[]; new <T>(arrayLength: number): T[]; new <T>(...items: T[]): T[]; isArray(arg: any): boolean; prototype: any[]; }'.
22+
!!! error TS2323: Type 'number' is not assignable to type 'ArrayConstructor'.
2323
!!! error TS2323: Property 'isArray' is missing in type 'Number'.
2424
var xs4: typeof Array<typeof x>;
2525
~
2626
!!! error TS1005: '=' expected.
2727
~
2828
!!! error TS1109: Expression expected.
2929
~~~
30-
!!! error TS2323: Type 'number' is not assignable to type '{ (arrayLength?: number): any[]; <T>(arrayLength: number): T[]; <T>(...items: T[]): T[]; new (arrayLength?: number): any[]; new <T>(arrayLength: number): T[]; new <T>(...items: T[]): T[]; isArray(arg: any): boolean; prototype: any[]; }'.
30+
!!! error TS2323: Type 'number' is not assignable to type 'ArrayConstructor'.

tests/baselines/reference/castNewObjectBug.types

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@ var xx = <Foo> new Object();
77
><Foo> new Object() : Foo
88
>Foo : Foo
99
>new Object() : Object
10-
>Object : { (): any; (value: any): any; new (value?: any): Object; prototype: Object; getPrototypeOf(o: any): any; getOwnPropertyDescriptor(o: any, p: string): PropertyDescriptor; getOwnPropertyNames(o: any): string[]; create(o: any, properties?: PropertyDescriptorMap): any; defineProperty(o: any, p: string, attributes: PropertyDescriptor): any; defineProperties(o: any, properties: PropertyDescriptorMap): any; seal(o: any): any; freeze(o: any): any; preventExtensions(o: any): any; isSealed(o: any): boolean; isFrozen(o: any): boolean; isExtensible(o: any): boolean; keys(o: any): string[]; }
10+
>Object : ObjectConstructor
1111

tests/baselines/reference/commaOperatorWithSecondOperandObjectType.types

+2-2
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ true, {}
108108
"string", new Date()
109109
>"string", new Date() : Date
110110
>new Date() : Date
111-
>Date : { (): string; new (): Date; new (value: number): Date; new (value: string): Date; new (year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): Date; prototype: Date; parse(s: string): number; UTC(year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): number; now(): number; }
111+
>Date : DateConstructor
112112

113113
STRING.toLowerCase(), new CLASS()
114114
>STRING.toLowerCase(), new CLASS() : CLASS
@@ -154,7 +154,7 @@ var resultIsObject10 = ("string", new Date());
154154
>("string", new Date()) : Date
155155
>"string", new Date() : Date
156156
>new Date() : Date
157-
>Date : { (): string; new (): Date; new (value: number): Date; new (value: string): Date; new (year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): Date; prototype: Date; parse(s: string): number; UTC(year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): number; now(): number; }
157+
>Date : DateConstructor
158158

159159
var resultIsObject11 = (STRING.toLowerCase(), new CLASS());
160160
>resultIsObject11 : CLASS

0 commit comments

Comments
 (0)