Как «заканчивается» и другие строковые функции генерируются в коде ES5 - PullRequest
3 голосов
/ 07 июня 2019

Я получил сообщение об ошибке Ошибка TS2339: во время переноса ts в js свойство 'argumentsWith' не существует для типа 'строка' .

При поиске в Google я

Я сделал то же самое, ошибка исчезла. Код ES6 сгенерирован.

команда получена ответом *1005* 'заканчивается с' функция ES6, целевой компилятор для ES6 ".было: tsc file-name.ts --target ES6

НО , если я не нацелился на ES6, возникла ошибка, и код все еще переносится.

И я получил действительный ES.

Насколько я знаю, до сих пор машинопись работает на ES5.

Итак, я получаю код ES5, потому что я не нацелился на ES6 во время переноса.

командабыло: tsc file-name.ts

Примечание: Я удалил старый файл .js.

Тогда, как «заканчивается» и другие строковые функции генерируются в коде ES5? Какони являются функцией ES6, а я не нацелился на ES6.

1 Ответ

3 голосов
/ 07 июня 2019

Существуют два вида вещей, которые вводят новые функции Javascript: синтаксис и встроенные объекты / методы .

Когда вы переносите (например, с Typescript или из ESNext в ES5), вы переводите синтаксис вашего кода из исходной версии в ES5. Например:

const foo = 'foo'; // ES6 syntax

может стать

var foo = 'foo';  // ES5 syntax

Это не влияет на несинтаксические функции. Следующий синтаксис в ES5 совершенно законен:

console.log(foo.endsWith('o'));

Но то, что синтаксис допустим, не обязательно означает, что то, к чему относится foo, обладает свойством endsWith.

Эти несинтаксические функции не требуют транспиляции , а скорее полизаполнения - то есть, если они не существуют в среде, определите их самостоятельно. Например, один из возможных polyfill для endsWith равен :

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;
  };
}

Если вы убедитесь, что приведенный выше код работает, вы не получите ошибку Property 'endsWith' does not exist on type 'string'.

Большинство новых объектов / методов могут быть заполнены, но некоторые не могут быть, по крайней мере, не совсем точно (например, Symbol s и Proxy x, IIRC).

Популярный сервис, который предоставляет полифилы для многих новых объектов / методов: polyfill.io .

Чтобы устаревшие браузеры могли понимать ваш код, написанный на ESNext (или Typescript), используйте и , и polyfills.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...