Typcript сообщает мне, что свойство padStart не существует в типе 'string'. Зачем?

Когда я набираю инструменты chrome dev:

"1".padStart(2,0)

я получил

"01"

Но когда я пишу

"1".padStart(2,0)

в моем проекте машинописного текста

я получил

Property 'padStart' does not exist on type 'string'.

Почему Typcript жалуется? Как это исправить?

Ответ 1

padStart определен в стандарте ES2017. Вы должны указать машинописи использовать соответствующие наборы (те, что для ES2017). Вы можете сделать это либо, установив целевое значение ES2017, если ваша среда выполнения поддерживает все языковые функции, требуемые ES2017 (что, вероятно, не так на момент написания статьи).

Другой вариант - просто установить опцию libs, чтобы получить типизацию для объектов времени выполнения в соответствии с ES2017 но при этом компилировать до любой языковой версии, на которую вы нацелены. (Обратите внимание, что сама среда выполнения должна поддерживать padStart, машинопись не предоставит никакой поли-заливка)

Вы можете сделать это в tsconfig используя опцию lib:

"compilerOptions": {
    "target": "es2016",
    "lib": [
        "es2017",
        "dom"
        "scripthost"
    ],
    // ...

}

Вы можете прочитать больше о lib vs target в этом ответе

Ответ 2

TypeScript предполагает по умолчанию, что ваш преобразованный код будет работать в худшем возможном окружении (на данный момент, я надеюсь, действительно хуже), то есть в браузере, поддерживающем только ES5. String.prototype.padStart - экспериментальная функция, поддерживаемая только в ES2017, поэтому TypeScript не может быть уверен, что во время выполнения он будет здесь и готов.

Если вы знаете, что этот "худший случай" не появится (вы не нацеливаетесь на старые браузеры или используете полисы), вы можете внести одно из следующих изменений в ваш tsconfig.json:

  1. Измените цель транспиляции. Это заставляет ваших потребителей иметь ES2017 (или более новое) время исполнения, но не требует от вас больше усилий. В этом случае установите target: "es2017".

  2. Измените список доступных библиотек. В этом случае, если вы не уверены, что ваши клиенты будут достаточно современными, вы должны предоставить им полисы для элементов ES2017, которые вы используете. В этом случае добавьте "es2017" в массив в параметре lib (если он был пуст, то это будет lib: ["es2017"]).

Ответ 3

Чтобы TypeScript знал о String.prototype.padStart(), вам нужно указать es2017 в списке библиотек вашего tsconfig.json. Если вы сделаете это, тогда TypeScript будет предполагать, что могут использоваться все функции ES2017, что может не соответствовать вашим ожиданиям.

Платформы, подобные Node.js, не всегда реализуют полный набор функций новой спецификации языка ECMAScript, поэтому безопаснее добавлять языковые функции только тогда, когда вы уверены, что они существуют. Если вы не уверены, какие функции поддерживаются вашей целевой платформой, вы можете найти их на страницах, таких как node.green или список совместимости браузера MDN.

Функция padStart является частью прототипа String, поэтому достаточно просто добавить es2017.string в ваш tsconfig.json:

{
  "compilerOptions": {
    "lib": ["es6", "es2017.string"],
    ...
  },
}