Javascript 如何';结束于';ES5代码中正在生成其他字符串函数

Javascript 如何';结束于';ES5代码中正在生成其他字符串函数,javascript,typescript,ecmascript-6,Javascript,Typescript,Ecmascript 6,我收到错误TS2339:将ts传输到js时,类型“string”上不存在属性“endsWith” 当我在谷歌上搜索时,我得到的答案是“endsWith”是ES6函数,目标是ts编译器到ES6” 我也这样做了,错误消失了。生成了ES6代码 命令是:tsc file-name.ts--target ES6 但是如果我没有以ES6为目标,错误就出现了,&仍然是代码传输。并且我得到了有效的ES 据我所知,到目前为止,typescript正在被传输到ES5 所以,我得到了ES5代码,因为在传输时我并没

我收到错误TS2339:将ts传输到js时,类型“string”上不存在属性“endsWith”

当我在谷歌上搜索时,我得到的答案是“endsWith”是ES6函数,目标是ts编译器到ES6”

我也这样做了,错误消失了。生成了ES6代码

命令是:
tsc file-name.ts--target ES6

但是如果我没有以ES6为目标,错误就出现了,&仍然是代码传输。并且我得到了有效的ES

据我所知,到目前为止,typescript正在被传输到ES5

所以,我得到了ES5代码,因为在传输时我并没有以ES6为目标

命令是:
tsc file name.ts

注意:我删除了旧的.js文件


那么“endsWith”和其他字符串函数是如何在ES5代码中生成的呢?因为它们是ES6函数,而我不是针对ES6的。

Javascript的新特性引入了两种不同的东西:语法和内置的对象/方法

传输时(例如使用Typescript,或从ESNext到ES5),您正在将代码的语法从原始版本转换为ES5。例如:

const foo = 'foo'; // ES6 syntax
可能成为

var foo = 'foo';  // ES5 syntax
这不会影响非语法功能。以下语法在ES5中完全合法:

console.log(foo.endsWith('o'));
但是仅仅因为语法是合法的,并不一定意味着
foo
所指的具有
endsWith
属性

这些非语法功能不需要transpiling,而是polyfilling——也就是说,如果环境中不存在这些功能,请自己定义它们。例如,一种可能的方法:

如果确保运行上述代码,则不会得到类型“string”上不存在的
属性“endsWith”
错误

大多数新对象/方法可以是多填充的,但有些不能,至少不能完全精确(例如
Symbol
s和
Proxy
x,IIRC)

为许多较新的对象/方法提供多填充的流行服务是

为了确保过时的浏览器能够理解用ESNext(或Typescript)编写的代码,请同时使用transpilation和polyfills

if (!String.prototype.endsWith) {
  String.prototype.endsWith = function(search, this_len) {
    if (this_len === undefined || this_len > this.length) {
      this_len = this.length;
    }
    return this.substring(this_len - search.length, this_len) === search;
  };
}