diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts
index 81884b9c75d..35aeb67df8f 100644
--- a/src/compiler/commandLineParser.ts
+++ b/src/compiler/commandLineParser.ts
@@ -43,6 +43,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.string", "lib.es2019.string.d.ts"],
["es2019.symbol", "lib.es2019.symbol.d.ts"],
["esnext.array", "lib.es2019.array.d.ts"],
["esnext.symbol", "lib.es2019.symbol.d.ts"],
diff --git a/src/lib/es2019.d.ts b/src/lib/es2019.d.ts
index 217d82a219c..b25f9e1d76a 100644
--- a/src/lib/es2019.d.ts
+++ b/src/lib/es2019.d.ts
@@ -1,3 +1,4 @@
///
///
+///
///
diff --git a/src/lib/es2019.string.d.ts b/src/lib/es2019.string.d.ts
new file mode 100644
index 00000000000..a0cde55c2e5
--- /dev/null
+++ b/src/lib/es2019.string.d.ts
@@ -0,0 +1,13 @@
+interface String {
+ /** Removes the trailing white space and line terminator characters from a string. */
+ trimEnd(): string;
+
+ /** Removes the leading white space and line terminator characters from a string. */
+ trimStart(): string;
+
+ /** Removes the trailing white space and line terminator characters from a string. */
+ trimLeft(): string;
+
+ /** Removes the leading white space and line terminator characters from a string. */
+ trimRight(): string;
+}
diff --git a/src/lib/libs.json b/src/lib/libs.json
index f1afe448f9f..cb4e6fc053f 100644
--- a/src/lib/libs.json
+++ b/src/lib/libs.json
@@ -34,6 +34,7 @@
"es2018.promise",
"es2018.intl",
"es2019.array",
+ "es2019.string",
"es2019.symbol",
"esnext.asynciterable",
"esnext.bigint",
diff --git a/src/testRunner/unittests/config/commandLineParsing.ts b/src/testRunner/unittests/config/commandLineParsing.ts
index 387715fe82a..3baf12bd431 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.intl', 'es2018.promise', 'es2018.regexp', 'es2019.array', '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.intl', 'es2018.promise', 'es2018.regexp', 'es2019.array', '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.intl', 'es2018.promise', 'es2018.regexp', 'es2019.array', '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.intl', 'es2018.promise', 'es2018.regexp', 'es2019.array', '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.intl', 'es2018.promise', 'es2018.regexp', 'es2019.array', '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.intl', 'es2018.promise', 'es2018.regexp', 'es2019.array', '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/bigintIndex.symbols b/tests/baselines/reference/bigintIndex.symbols
index c0aea092753..dff23a016ee 100644
--- a/tests/baselines/reference/bigintIndex.symbols
+++ b/tests/baselines/reference/bigintIndex.symbols
@@ -53,7 +53,7 @@ typedArray[bigNum] = 0xAA; // should error
typedArray[String(bigNum)] = 0xAA;
>typedArray : Symbol(typedArray, Decl(a.ts, 17, 5))
->String : Symbol(String, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --) ... and 2 more)
+>String : Symbol(String, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --) ... and 3 more)
>bigNum : Symbol(bigNum, Decl(a.ts, 16, 5))
typedArray["1"] = 0xBB;
diff --git a/tests/baselines/reference/stringTrim.js b/tests/baselines/reference/stringTrim.js
new file mode 100644
index 00000000000..973df9c1ebb
--- /dev/null
+++ b/tests/baselines/reference/stringTrim.js
@@ -0,0 +1,14 @@
+//// [stringTrim.ts]
+var trimmed: string;
+trimmed = "abcde".trimEnd();
+trimmed = "abcde".trimStart();
+trimmed = "abcde".trimLeft();
+trimmed = "abcde".trimRight();
+
+
+//// [stringTrim.js]
+var trimmed;
+trimmed = "abcde".trimEnd();
+trimmed = "abcde".trimStart();
+trimmed = "abcde".trimLeft();
+trimmed = "abcde".trimRight();
diff --git a/tests/baselines/reference/stringTrim.symbols b/tests/baselines/reference/stringTrim.symbols
new file mode 100644
index 00000000000..00f7b34d166
--- /dev/null
+++ b/tests/baselines/reference/stringTrim.symbols
@@ -0,0 +1,24 @@
+=== tests/cases/compiler/stringTrim.ts ===
+var trimmed: string;
+>trimmed : Symbol(trimmed, Decl(stringTrim.ts, 0, 3))
+
+trimmed = "abcde".trimEnd();
+>trimmed : Symbol(trimmed, Decl(stringTrim.ts, 0, 3))
+>"abcde".trimEnd : Symbol(String.trimEnd, Decl(lib.es2019.string.d.ts, --, --))
+>trimEnd : Symbol(String.trimEnd, Decl(lib.es2019.string.d.ts, --, --))
+
+trimmed = "abcde".trimStart();
+>trimmed : Symbol(trimmed, Decl(stringTrim.ts, 0, 3))
+>"abcde".trimStart : Symbol(String.trimStart, Decl(lib.es2019.string.d.ts, --, --))
+>trimStart : Symbol(String.trimStart, Decl(lib.es2019.string.d.ts, --, --))
+
+trimmed = "abcde".trimLeft();
+>trimmed : Symbol(trimmed, Decl(stringTrim.ts, 0, 3))
+>"abcde".trimLeft : Symbol(String.trimLeft, Decl(lib.es2019.string.d.ts, --, --))
+>trimLeft : Symbol(String.trimLeft, Decl(lib.es2019.string.d.ts, --, --))
+
+trimmed = "abcde".trimRight();
+>trimmed : Symbol(trimmed, Decl(stringTrim.ts, 0, 3))
+>"abcde".trimRight : Symbol(String.trimRight, Decl(lib.es2019.string.d.ts, --, --))
+>trimRight : Symbol(String.trimRight, Decl(lib.es2019.string.d.ts, --, --))
+
diff --git a/tests/baselines/reference/stringTrim.types b/tests/baselines/reference/stringTrim.types
new file mode 100644
index 00000000000..5da0b98fb1a
--- /dev/null
+++ b/tests/baselines/reference/stringTrim.types
@@ -0,0 +1,36 @@
+=== tests/cases/compiler/stringTrim.ts ===
+var trimmed: string;
+>trimmed : string
+
+trimmed = "abcde".trimEnd();
+>trimmed = "abcde".trimEnd() : string
+>trimmed : string
+>"abcde".trimEnd() : string
+>"abcde".trimEnd : () => string
+>"abcde" : "abcde"
+>trimEnd : () => string
+
+trimmed = "abcde".trimStart();
+>trimmed = "abcde".trimStart() : string
+>trimmed : string
+>"abcde".trimStart() : string
+>"abcde".trimStart : () => string
+>"abcde" : "abcde"
+>trimStart : () => string
+
+trimmed = "abcde".trimLeft();
+>trimmed = "abcde".trimLeft() : string
+>trimmed : string
+>"abcde".trimLeft() : string
+>"abcde".trimLeft : () => string
+>"abcde" : "abcde"
+>trimLeft : () => string
+
+trimmed = "abcde".trimRight();
+>trimmed = "abcde".trimRight() : string
+>trimmed : string
+>"abcde".trimRight() : string
+>"abcde".trimRight : () => string
+>"abcde" : "abcde"
+>trimRight : () => string
+
diff --git a/tests/cases/compiler/stringTrim.ts b/tests/cases/compiler/stringTrim.ts
new file mode 100644
index 00000000000..d0329b87749
--- /dev/null
+++ b/tests/cases/compiler/stringTrim.ts
@@ -0,0 +1,7 @@
+// @target: es2019
+
+var trimmed: string;
+trimmed = "abcde".trimEnd();
+trimmed = "abcde".trimStart();
+trimmed = "abcde".trimLeft();
+trimmed = "abcde".trimRight();