From 67e9d1f9f7ae979b58627a0c052add69bb441fc1 Mon Sep 17 00:00:00 2001 From: Kagami Sascha Rosylight Date: Mon, 15 Apr 2019 20:55:29 +0900 Subject: [PATCH 1/4] add ES2019 Object.fromEntries function --- src/compiler/commandLineParser.ts | 1 + src/lib/es2019.d.ts | 1 + src/lib/es2019.object.d.ts | 5 +++ src/lib/libs.json | 1 + .../unittests/config/commandLineParsing.ts | 6 +-- .../baselines/reference/objectFromEntries.js | 10 +++++ .../reference/objectFromEntries.symbols | 22 ++++++++++ .../reference/objectFromEntries.types | 42 +++++++++++++++++++ tests/cases/compiler/objectFromEntries.ts | 5 +++ 9 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 src/lib/es2019.object.d.ts create mode 100644 tests/baselines/reference/objectFromEntries.js create mode 100644 tests/baselines/reference/objectFromEntries.symbols create mode 100644 tests/baselines/reference/objectFromEntries.types create mode 100644 tests/cases/compiler/objectFromEntries.ts diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts index 12a20e0df42e1..9541df435d933 100644 --- a/src/compiler/commandLineParser.ts +++ b/src/compiler/commandLineParser.ts @@ -44,6 +44,7 @@ namespace ts { ["es2018.promise", "lib.es2018.promise.d.ts"], ["es2018.regexp", "lib.es2018.regexp.d.ts"], ["es2019.array", "lib.es2019.array.d.ts"], + ["es2019.object", "lib.es2019.object.d.ts"], ["es2019.string", "lib.es2019.string.d.ts"], ["es2019.symbol", "lib.es2019.symbol.d.ts"], ["esnext.array", "lib.es2019.array.d.ts"], diff --git a/src/lib/es2019.d.ts b/src/lib/es2019.d.ts index b25f9e1d76af9..29212ecfe0f1b 100644 --- a/src/lib/es2019.d.ts +++ b/src/lib/es2019.d.ts @@ -1,4 +1,5 @@ /// /// +/// /// /// diff --git a/src/lib/es2019.object.d.ts b/src/lib/es2019.object.d.ts new file mode 100644 index 0000000000000..5b59e775dcd59 --- /dev/null +++ b/src/lib/es2019.object.d.ts @@ -0,0 +1,5 @@ +/// + +interface ObjectConstructor { + fromEntries(entries: Iterable<[string | symbol, any]>): any; +} diff --git a/src/lib/libs.json b/src/lib/libs.json index fa5f4060acd6a..143a61d928bbd 100644 --- a/src/lib/libs.json +++ b/src/lib/libs.json @@ -35,6 +35,7 @@ "es2018.promise", "es2018.intl", "es2019.array", + "es2019.object", "es2019.string", "es2019.symbol", "esnext.bigint", diff --git a/src/testRunner/unittests/config/commandLineParsing.ts b/src/testRunner/unittests/config/commandLineParsing.ts index ccb2378c644a8..22af3c30bda5c 100644 --- a/src/testRunner/unittests/config/commandLineParsing.ts +++ b/src/testRunner/unittests/config/commandLineParsing.ts @@ -57,7 +57,7 @@ namespace ts { assertParseResult(["--lib", "es5,invalidOption", "0.ts"], { errors: [{ - messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'es2019', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.asynciterable', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'es2019.array', 'es2019.string', 'es2019.symbol', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable', 'esnext.intl', 'esnext.bigint'.", + messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'es2019', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.asynciterable', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'es2019.array', 'es2019.object', 'es2019.string', 'es2019.symbol', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable', 'esnext.intl', 'esnext.bigint'.", category: Diagnostics.Argument_for_0_option_must_be_Colon_1.category, code: Diagnostics.Argument_for_0_option_must_be_Colon_1.code, file: undefined, @@ -259,7 +259,7 @@ namespace ts { assertParseResult(["--lib", "es5,", "es7", "0.ts"], { errors: [{ - messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'es2019', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.asynciterable', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'es2019.array', 'es2019.string', 'es2019.symbol', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable', 'esnext.intl', 'esnext.bigint'.", + messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'es2019', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.asynciterable', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'es2019.array', 'es2019.object', 'es2019.string', 'es2019.symbol', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable', 'esnext.intl', 'esnext.bigint'.", category: Diagnostics.Argument_for_0_option_must_be_Colon_1.category, code: Diagnostics.Argument_for_0_option_must_be_Colon_1.code, file: undefined, @@ -278,7 +278,7 @@ namespace ts { assertParseResult(["--lib", "es5, ", "es7", "0.ts"], { errors: [{ - messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'es2019', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.asynciterable', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'es2019.array', 'es2019.string', 'es2019.symbol', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable', 'esnext.intl', 'esnext.bigint'.", + messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'es2019', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.asynciterable', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'es2019.array', 'es2019.object', 'es2019.string', 'es2019.symbol', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable', 'esnext.intl', 'esnext.bigint'.", category: Diagnostics.Argument_for_0_option_must_be_Colon_1.category, code: Diagnostics.Argument_for_0_option_must_be_Colon_1.code, file: undefined, diff --git a/tests/baselines/reference/objectFromEntries.js b/tests/baselines/reference/objectFromEntries.js new file mode 100644 index 0000000000000..5ed0398cbea2f --- /dev/null +++ b/tests/baselines/reference/objectFromEntries.js @@ -0,0 +1,10 @@ +//// [objectFromEntries.ts] +const o = Object.fromEntries([['a', 1], ['b', 2], ['c', 3]]); +const o2 = Object.fromEntries(new URLSearchParams()); +const o3 = Object.fromEntries(new Map([[Symbol("key"), "value"]])); + + +//// [objectFromEntries.js] +const o = Object.fromEntries([['a', 1], ['b', 2], ['c', 3]]); +const o2 = Object.fromEntries(new URLSearchParams()); +const o3 = Object.fromEntries(new Map([[Symbol("key"), "value"]])); diff --git a/tests/baselines/reference/objectFromEntries.symbols b/tests/baselines/reference/objectFromEntries.symbols new file mode 100644 index 0000000000000..56aa43b02ac67 --- /dev/null +++ b/tests/baselines/reference/objectFromEntries.symbols @@ -0,0 +1,22 @@ +=== tests/cases/compiler/objectFromEntries.ts === +const o = Object.fromEntries([['a', 1], ['b', 2], ['c', 3]]); +>o : Symbol(o, Decl(objectFromEntries.ts, 0, 5)) +>Object.fromEntries : Symbol(ObjectConstructor.fromEntries, Decl(lib.es2019.object.d.ts, --, --)) +>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>fromEntries : Symbol(ObjectConstructor.fromEntries, Decl(lib.es2019.object.d.ts, --, --)) + +const o2 = Object.fromEntries(new URLSearchParams()); +>o2 : Symbol(o2, Decl(objectFromEntries.ts, 1, 5)) +>Object.fromEntries : Symbol(ObjectConstructor.fromEntries, Decl(lib.es2019.object.d.ts, --, --)) +>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>fromEntries : Symbol(ObjectConstructor.fromEntries, Decl(lib.es2019.object.d.ts, --, --)) +>URLSearchParams : Symbol(URLSearchParams, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --), Decl(lib.dom.iterable.d.ts, --, --)) + +const o3 = Object.fromEntries(new Map([[Symbol("key"), "value"]])); +>o3 : Symbol(o3, Decl(objectFromEntries.ts, 2, 5)) +>Object.fromEntries : Symbol(ObjectConstructor.fromEntries, Decl(lib.es2019.object.d.ts, --, --)) +>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>fromEntries : Symbol(ObjectConstructor.fromEntries, Decl(lib.es2019.object.d.ts, --, --)) +>Map : Symbol(Map, Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) +>Symbol : Symbol(Symbol, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2019.symbol.d.ts, --, --)) + diff --git a/tests/baselines/reference/objectFromEntries.types b/tests/baselines/reference/objectFromEntries.types new file mode 100644 index 0000000000000..8a09571af708c --- /dev/null +++ b/tests/baselines/reference/objectFromEntries.types @@ -0,0 +1,42 @@ +=== tests/cases/compiler/objectFromEntries.ts === +const o = Object.fromEntries([['a', 1], ['b', 2], ['c', 3]]); +>o : any +>Object.fromEntries([['a', 1], ['b', 2], ['c', 3]]) : any +>Object.fromEntries : (entries: Iterable<[string | symbol, any]>) => any +>Object : ObjectConstructor +>fromEntries : (entries: Iterable<[string | symbol, any]>) => any +>[['a', 1], ['b', 2], ['c', 3]] : [string, number][] +>['a', 1] : [string, number] +>'a' : "a" +>1 : 1 +>['b', 2] : [string, number] +>'b' : "b" +>2 : 2 +>['c', 3] : [string, number] +>'c' : "c" +>3 : 3 + +const o2 = Object.fromEntries(new URLSearchParams()); +>o2 : any +>Object.fromEntries(new URLSearchParams()) : any +>Object.fromEntries : (entries: Iterable<[string | symbol, any]>) => any +>Object : ObjectConstructor +>fromEntries : (entries: Iterable<[string | symbol, any]>) => any +>new URLSearchParams() : URLSearchParams +>URLSearchParams : { new (init?: string | URLSearchParams | string[][] | Record): URLSearchParams; prototype: URLSearchParams; } + +const o3 = Object.fromEntries(new Map([[Symbol("key"), "value"]])); +>o3 : any +>Object.fromEntries(new Map([[Symbol("key"), "value"]])) : any +>Object.fromEntries : (entries: Iterable<[string | symbol, any]>) => any +>Object : ObjectConstructor +>fromEntries : (entries: Iterable<[string | symbol, any]>) => any +>new Map([[Symbol("key"), "value"]]) : Map +>Map : MapConstructor +>[[Symbol("key"), "value"]] : [symbol, string][] +>[Symbol("key"), "value"] : [symbol, string] +>Symbol("key") : symbol +>Symbol : SymbolConstructor +>"key" : "key" +>"value" : "value" + diff --git a/tests/cases/compiler/objectFromEntries.ts b/tests/cases/compiler/objectFromEntries.ts new file mode 100644 index 0000000000000..5f95da95caccd --- /dev/null +++ b/tests/cases/compiler/objectFromEntries.ts @@ -0,0 +1,5 @@ +// @target: es2019 + +const o = Object.fromEntries([['a', 1], ['b', 2], ['c', 3]]); +const o2 = Object.fromEntries(new URLSearchParams()); +const o3 = Object.fromEntries(new Map([[Symbol("key"), "value"]])); From 32caaf60c0f53a258e3a371bd164a51e15b3201b Mon Sep 17 00:00:00 2001 From: Kagami Sascha Rosylight Date: Mon, 15 Apr 2019 22:21:59 +0900 Subject: [PATCH 2/4] add some comments --- src/lib/es2019.object.d.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/lib/es2019.object.d.ts b/src/lib/es2019.object.d.ts index 5b59e775dcd59..5233cfbacd6e7 100644 --- a/src/lib/es2019.object.d.ts +++ b/src/lib/es2019.object.d.ts @@ -1,5 +1,9 @@ /// interface ObjectConstructor { + /** + * Returns an object created by key-value entries for properties and methods + * @param entries An iterable object that contains key-value entries for properties and methods. + */ fromEntries(entries: Iterable<[string | symbol, any]>): any; } From 9bc4d6a7b93fac579bf227dcbf0cf4ccab6b8724 Mon Sep 17 00:00:00 2001 From: Kagami Sascha Rosylight Date: Wed, 24 Apr 2019 10:43:11 +0900 Subject: [PATCH 3/4] apply suggested changes --- src/lib/es2019.object.d.ts | 2 +- .../reference/objectFromEntries.types | 24 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/lib/es2019.object.d.ts b/src/lib/es2019.object.d.ts index 5233cfbacd6e7..b6413229dbb62 100644 --- a/src/lib/es2019.object.d.ts +++ b/src/lib/es2019.object.d.ts @@ -5,5 +5,5 @@ interface ObjectConstructor { * Returns an object created by key-value entries for properties and methods * @param entries An iterable object that contains key-value entries for properties and methods. */ - fromEntries(entries: Iterable<[string | symbol, any]>): any; + fromEntries(entries: Iterable<[PropertyKey, T]>): { [k in PropertyKey]: T }; } diff --git a/tests/baselines/reference/objectFromEntries.types b/tests/baselines/reference/objectFromEntries.types index 8a09571af708c..b4c7143db4bd0 100644 --- a/tests/baselines/reference/objectFromEntries.types +++ b/tests/baselines/reference/objectFromEntries.types @@ -1,10 +1,10 @@ === tests/cases/compiler/objectFromEntries.ts === const o = Object.fromEntries([['a', 1], ['b', 2], ['c', 3]]); ->o : any ->Object.fromEntries([['a', 1], ['b', 2], ['c', 3]]) : any ->Object.fromEntries : (entries: Iterable<[string | symbol, any]>) => any +>o : { [x: string]: number; [x: number]: number; } +>Object.fromEntries([['a', 1], ['b', 2], ['c', 3]]) : { [x: string]: number; [x: number]: number; } +>Object.fromEntries : (entries: Iterable<[string | number | symbol, T]>) => { [x: string]: T; [x: number]: T; } >Object : ObjectConstructor ->fromEntries : (entries: Iterable<[string | symbol, any]>) => any +>fromEntries : (entries: Iterable<[string | number | symbol, T]>) => { [x: string]: T; [x: number]: T; } >[['a', 1], ['b', 2], ['c', 3]] : [string, number][] >['a', 1] : [string, number] >'a' : "a" @@ -17,20 +17,20 @@ const o = Object.fromEntries([['a', 1], ['b', 2], ['c', 3]]); >3 : 3 const o2 = Object.fromEntries(new URLSearchParams()); ->o2 : any ->Object.fromEntries(new URLSearchParams()) : any ->Object.fromEntries : (entries: Iterable<[string | symbol, any]>) => any +>o2 : { [x: string]: string; [x: number]: string; } +>Object.fromEntries(new URLSearchParams()) : { [x: string]: string; [x: number]: string; } +>Object.fromEntries : (entries: Iterable<[string | number | symbol, T]>) => { [x: string]: T; [x: number]: T; } >Object : ObjectConstructor ->fromEntries : (entries: Iterable<[string | symbol, any]>) => any +>fromEntries : (entries: Iterable<[string | number | symbol, T]>) => { [x: string]: T; [x: number]: T; } >new URLSearchParams() : URLSearchParams >URLSearchParams : { new (init?: string | URLSearchParams | string[][] | Record): URLSearchParams; prototype: URLSearchParams; } const o3 = Object.fromEntries(new Map([[Symbol("key"), "value"]])); ->o3 : any ->Object.fromEntries(new Map([[Symbol("key"), "value"]])) : any ->Object.fromEntries : (entries: Iterable<[string | symbol, any]>) => any +>o3 : { [x: string]: string; [x: number]: string; } +>Object.fromEntries(new Map([[Symbol("key"), "value"]])) : { [x: string]: string; [x: number]: string; } +>Object.fromEntries : (entries: Iterable<[string | number | symbol, T]>) => { [x: string]: T; [x: number]: T; } >Object : ObjectConstructor ->fromEntries : (entries: Iterable<[string | symbol, any]>) => any +>fromEntries : (entries: Iterable<[string | number | symbol, T]>) => { [x: string]: T; [x: number]: T; } >new Map([[Symbol("key"), "value"]]) : Map >Map : MapConstructor >[[Symbol("key"), "value"]] : [symbol, string][] From 42626bd0ef833fb2dc5fe5c98879a0cdfc345035 Mon Sep 17 00:00:00 2001 From: Kagami Sascha Rosylight Date: Thu, 25 Apr 2019 14:37:07 +0900 Subject: [PATCH 4/4] add readonly and general any --- src/lib/es2019.object.d.ts | 8 ++- .../baselines/reference/objectFromEntries.js | 10 +++ .../reference/objectFromEntries.symbols | 38 ++++++++++-- .../reference/objectFromEntries.types | 62 +++++++++++++++++-- tests/cases/compiler/objectFromEntries.ts | 6 ++ 5 files changed, 111 insertions(+), 13 deletions(-) diff --git a/src/lib/es2019.object.d.ts b/src/lib/es2019.object.d.ts index b6413229dbb62..69b185d7ca91c 100644 --- a/src/lib/es2019.object.d.ts +++ b/src/lib/es2019.object.d.ts @@ -5,5 +5,11 @@ interface ObjectConstructor { * Returns an object created by key-value entries for properties and methods * @param entries An iterable object that contains key-value entries for properties and methods. */ - fromEntries(entries: Iterable<[PropertyKey, T]>): { [k in PropertyKey]: T }; + fromEntries(entries: Iterable): { [k in PropertyKey]: T }; + + /** + * Returns an object created by key-value entries for properties and methods + * @param entries An iterable object that contains key-value entries for properties and methods. + */ + fromEntries(entries: Iterable): any; } diff --git a/tests/baselines/reference/objectFromEntries.js b/tests/baselines/reference/objectFromEntries.js index 5ed0398cbea2f..fc5b9a107a3be 100644 --- a/tests/baselines/reference/objectFromEntries.js +++ b/tests/baselines/reference/objectFromEntries.js @@ -2,9 +2,19 @@ const o = Object.fromEntries([['a', 1], ['b', 2], ['c', 3]]); const o2 = Object.fromEntries(new URLSearchParams()); const o3 = Object.fromEntries(new Map([[Symbol("key"), "value"]])); + +const frozenArray = Object.freeze([['a', 1], ['b', 2], ['c', 3]]); +const o4 = Object.fromEntries(frozenArray); + +const frozenArray2: readonly [string, number][] = Object.freeze([['a', 1], ['b', 2], ['c', 3]]); +const o5 = Object.fromEntries(frozenArray2); //// [objectFromEntries.js] const o = Object.fromEntries([['a', 1], ['b', 2], ['c', 3]]); const o2 = Object.fromEntries(new URLSearchParams()); const o3 = Object.fromEntries(new Map([[Symbol("key"), "value"]])); +const frozenArray = Object.freeze([['a', 1], ['b', 2], ['c', 3]]); +const o4 = Object.fromEntries(frozenArray); +const frozenArray2 = Object.freeze([['a', 1], ['b', 2], ['c', 3]]); +const o5 = Object.fromEntries(frozenArray2); diff --git a/tests/baselines/reference/objectFromEntries.symbols b/tests/baselines/reference/objectFromEntries.symbols index 56aa43b02ac67..882b553eb558c 100644 --- a/tests/baselines/reference/objectFromEntries.symbols +++ b/tests/baselines/reference/objectFromEntries.symbols @@ -1,22 +1,48 @@ === tests/cases/compiler/objectFromEntries.ts === const o = Object.fromEntries([['a', 1], ['b', 2], ['c', 3]]); >o : Symbol(o, Decl(objectFromEntries.ts, 0, 5)) ->Object.fromEntries : Symbol(ObjectConstructor.fromEntries, Decl(lib.es2019.object.d.ts, --, --)) +>Object.fromEntries : Symbol(ObjectConstructor.fromEntries, Decl(lib.es2019.object.d.ts, --, --), Decl(lib.es2019.object.d.ts, --, --)) >Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) ->fromEntries : Symbol(ObjectConstructor.fromEntries, Decl(lib.es2019.object.d.ts, --, --)) +>fromEntries : Symbol(ObjectConstructor.fromEntries, Decl(lib.es2019.object.d.ts, --, --), Decl(lib.es2019.object.d.ts, --, --)) const o2 = Object.fromEntries(new URLSearchParams()); >o2 : Symbol(o2, Decl(objectFromEntries.ts, 1, 5)) ->Object.fromEntries : Symbol(ObjectConstructor.fromEntries, Decl(lib.es2019.object.d.ts, --, --)) +>Object.fromEntries : Symbol(ObjectConstructor.fromEntries, Decl(lib.es2019.object.d.ts, --, --), Decl(lib.es2019.object.d.ts, --, --)) >Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) ->fromEntries : Symbol(ObjectConstructor.fromEntries, Decl(lib.es2019.object.d.ts, --, --)) +>fromEntries : Symbol(ObjectConstructor.fromEntries, Decl(lib.es2019.object.d.ts, --, --), Decl(lib.es2019.object.d.ts, --, --)) >URLSearchParams : Symbol(URLSearchParams, Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --), Decl(lib.dom.d.ts, --, --), Decl(lib.dom.iterable.d.ts, --, --)) const o3 = Object.fromEntries(new Map([[Symbol("key"), "value"]])); >o3 : Symbol(o3, Decl(objectFromEntries.ts, 2, 5)) ->Object.fromEntries : Symbol(ObjectConstructor.fromEntries, Decl(lib.es2019.object.d.ts, --, --)) +>Object.fromEntries : Symbol(ObjectConstructor.fromEntries, Decl(lib.es2019.object.d.ts, --, --), Decl(lib.es2019.object.d.ts, --, --)) >Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) ->fromEntries : Symbol(ObjectConstructor.fromEntries, Decl(lib.es2019.object.d.ts, --, --)) +>fromEntries : Symbol(ObjectConstructor.fromEntries, Decl(lib.es2019.object.d.ts, --, --), Decl(lib.es2019.object.d.ts, --, --)) >Map : Symbol(Map, Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.collection.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) >Symbol : Symbol(Symbol, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2019.symbol.d.ts, --, --)) +const frozenArray = Object.freeze([['a', 1], ['b', 2], ['c', 3]]); +>frozenArray : Symbol(frozenArray, Decl(objectFromEntries.ts, 4, 5)) +>Object.freeze : Symbol(ObjectConstructor.freeze, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>freeze : Symbol(ObjectConstructor.freeze, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) + +const o4 = Object.fromEntries(frozenArray); +>o4 : Symbol(o4, Decl(objectFromEntries.ts, 5, 5)) +>Object.fromEntries : Symbol(ObjectConstructor.fromEntries, Decl(lib.es2019.object.d.ts, --, --), Decl(lib.es2019.object.d.ts, --, --)) +>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>fromEntries : Symbol(ObjectConstructor.fromEntries, Decl(lib.es2019.object.d.ts, --, --), Decl(lib.es2019.object.d.ts, --, --)) +>frozenArray : Symbol(frozenArray, Decl(objectFromEntries.ts, 4, 5)) + +const frozenArray2: readonly [string, number][] = Object.freeze([['a', 1], ['b', 2], ['c', 3]]); +>frozenArray2 : Symbol(frozenArray2, Decl(objectFromEntries.ts, 7, 5)) +>Object.freeze : Symbol(ObjectConstructor.freeze, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>freeze : Symbol(ObjectConstructor.freeze, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) + +const o5 = Object.fromEntries(frozenArray2); +>o5 : Symbol(o5, Decl(objectFromEntries.ts, 8, 5)) +>Object.fromEntries : Symbol(ObjectConstructor.fromEntries, Decl(lib.es2019.object.d.ts, --, --), Decl(lib.es2019.object.d.ts, --, --)) +>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) +>fromEntries : Symbol(ObjectConstructor.fromEntries, Decl(lib.es2019.object.d.ts, --, --), Decl(lib.es2019.object.d.ts, --, --)) +>frozenArray2 : Symbol(frozenArray2, Decl(objectFromEntries.ts, 7, 5)) + diff --git a/tests/baselines/reference/objectFromEntries.types b/tests/baselines/reference/objectFromEntries.types index b4c7143db4bd0..265cbd2d87813 100644 --- a/tests/baselines/reference/objectFromEntries.types +++ b/tests/baselines/reference/objectFromEntries.types @@ -2,9 +2,9 @@ const o = Object.fromEntries([['a', 1], ['b', 2], ['c', 3]]); >o : { [x: string]: number; [x: number]: number; } >Object.fromEntries([['a', 1], ['b', 2], ['c', 3]]) : { [x: string]: number; [x: number]: number; } ->Object.fromEntries : (entries: Iterable<[string | number | symbol, T]>) => { [x: string]: T; [x: number]: T; } +>Object.fromEntries : { (entries: Iterable): { [x: string]: T; [x: number]: T; }; (entries: Iterable): any; } >Object : ObjectConstructor ->fromEntries : (entries: Iterable<[string | number | symbol, T]>) => { [x: string]: T; [x: number]: T; } +>fromEntries : { (entries: Iterable): { [x: string]: T; [x: number]: T; }; (entries: Iterable): any; } >[['a', 1], ['b', 2], ['c', 3]] : [string, number][] >['a', 1] : [string, number] >'a' : "a" @@ -19,18 +19,18 @@ const o = Object.fromEntries([['a', 1], ['b', 2], ['c', 3]]); const o2 = Object.fromEntries(new URLSearchParams()); >o2 : { [x: string]: string; [x: number]: string; } >Object.fromEntries(new URLSearchParams()) : { [x: string]: string; [x: number]: string; } ->Object.fromEntries : (entries: Iterable<[string | number | symbol, T]>) => { [x: string]: T; [x: number]: T; } +>Object.fromEntries : { (entries: Iterable): { [x: string]: T; [x: number]: T; }; (entries: Iterable): any; } >Object : ObjectConstructor ->fromEntries : (entries: Iterable<[string | number | symbol, T]>) => { [x: string]: T; [x: number]: T; } +>fromEntries : { (entries: Iterable): { [x: string]: T; [x: number]: T; }; (entries: Iterable): any; } >new URLSearchParams() : URLSearchParams >URLSearchParams : { new (init?: string | URLSearchParams | string[][] | Record): URLSearchParams; prototype: URLSearchParams; } const o3 = Object.fromEntries(new Map([[Symbol("key"), "value"]])); >o3 : { [x: string]: string; [x: number]: string; } >Object.fromEntries(new Map([[Symbol("key"), "value"]])) : { [x: string]: string; [x: number]: string; } ->Object.fromEntries : (entries: Iterable<[string | number | symbol, T]>) => { [x: string]: T; [x: number]: T; } +>Object.fromEntries : { (entries: Iterable): { [x: string]: T; [x: number]: T; }; (entries: Iterable): any; } >Object : ObjectConstructor ->fromEntries : (entries: Iterable<[string | number | symbol, T]>) => { [x: string]: T; [x: number]: T; } +>fromEntries : { (entries: Iterable): { [x: string]: T; [x: number]: T; }; (entries: Iterable): any; } >new Map([[Symbol("key"), "value"]]) : Map >Map : MapConstructor >[[Symbol("key"), "value"]] : [symbol, string][] @@ -40,3 +40,53 @@ const o3 = Object.fromEntries(new Map([[Symbol("key"), "value"]])); >"key" : "key" >"value" : "value" +const frozenArray = Object.freeze([['a', 1], ['b', 2], ['c', 3]]); +>frozenArray : readonly (string | number)[][] +>Object.freeze([['a', 1], ['b', 2], ['c', 3]]) : readonly (string | number)[][] +>Object.freeze : { (a: T[]): readonly T[]; (f: T): T; (o: T): Readonly; } +>Object : ObjectConstructor +>freeze : { (a: T[]): readonly T[]; (f: T): T; (o: T): Readonly; } +>[['a', 1], ['b', 2], ['c', 3]] : (string | number)[][] +>['a', 1] : (string | number)[] +>'a' : "a" +>1 : 1 +>['b', 2] : (string | number)[] +>'b' : "b" +>2 : 2 +>['c', 3] : (string | number)[] +>'c' : "c" +>3 : 3 + +const o4 = Object.fromEntries(frozenArray); +>o4 : any +>Object.fromEntries(frozenArray) : any +>Object.fromEntries : { (entries: Iterable): { [x: string]: T; [x: number]: T; }; (entries: Iterable): any; } +>Object : ObjectConstructor +>fromEntries : { (entries: Iterable): { [x: string]: T; [x: number]: T; }; (entries: Iterable): any; } +>frozenArray : readonly (string | number)[][] + +const frozenArray2: readonly [string, number][] = Object.freeze([['a', 1], ['b', 2], ['c', 3]]); +>frozenArray2 : readonly [string, number][] +>Object.freeze([['a', 1], ['b', 2], ['c', 3]]) : readonly [string, number][] +>Object.freeze : { (a: T[]): readonly T[]; (f: T): T; (o: T): Readonly; } +>Object : ObjectConstructor +>freeze : { (a: T[]): readonly T[]; (f: T): T; (o: T): Readonly; } +>[['a', 1], ['b', 2], ['c', 3]] : [string, number][] +>['a', 1] : [string, number] +>'a' : "a" +>1 : 1 +>['b', 2] : [string, number] +>'b' : "b" +>2 : 2 +>['c', 3] : [string, number] +>'c' : "c" +>3 : 3 + +const o5 = Object.fromEntries(frozenArray2); +>o5 : { [x: string]: number; [x: number]: number; } +>Object.fromEntries(frozenArray2) : { [x: string]: number; [x: number]: number; } +>Object.fromEntries : { (entries: Iterable): { [x: string]: T; [x: number]: T; }; (entries: Iterable): any; } +>Object : ObjectConstructor +>fromEntries : { (entries: Iterable): { [x: string]: T; [x: number]: T; }; (entries: Iterable): any; } +>frozenArray2 : readonly [string, number][] + diff --git a/tests/cases/compiler/objectFromEntries.ts b/tests/cases/compiler/objectFromEntries.ts index 5f95da95caccd..9993edbf344ec 100644 --- a/tests/cases/compiler/objectFromEntries.ts +++ b/tests/cases/compiler/objectFromEntries.ts @@ -3,3 +3,9 @@ const o = Object.fromEntries([['a', 1], ['b', 2], ['c', 3]]); const o2 = Object.fromEntries(new URLSearchParams()); const o3 = Object.fromEntries(new Map([[Symbol("key"), "value"]])); + +const frozenArray = Object.freeze([['a', 1], ['b', 2], ['c', 3]]); +const o4 = Object.fromEntries(frozenArray); + +const frozenArray2: readonly [string, number][] = Object.freeze([['a', 1], ['b', 2], ['c', 3]]); +const o5 = Object.fromEntries(frozenArray2);