Подтвердить что ты не робот

Typescript 2.0. Поле "types" в tsconfig.json

Я не понимаю значение поля types в tsconfig.json. В документации я прочитал такой текст:

        "types": {
          "description": "Type declaration files to be included in compilation. Requires TypeScript version 2.0 or later.",
          "type": "array",
          "items": {
            "type": "string"
          }
        },

Насколько я понимаю, если я устанавливаю @types/express, я должен добавить такую ​​строку в tsconfig.json

{
  "compilerOptions": {
     ...
     "types": ["lodash"]
   }
} 

но все отлично работает без него. И теперь я не понимаю, зачем мне поле types

4b9b3361

Ответ 1

По состоянию на TypeScript 2. * 'tsconfig.json' имеет следующие два доступных свойства:

{
    'typeRoots': [],
    'types': [] 
}

Я буду подробно описывать порядок.


  • 'typeRoots' указывает корневые папки, в которых транспилятор должен искать определения типов (например: 'node_modules').

    • Если вы используете typescript, вы знаете, что для разных библиотек, которые не были написаны с использованием typescript, вам нужны определения, чтобы компилятор мог распознавать глобальные переменные и иметь поддержку IntelliSense.

    • Эта проблема была решена проектами (repos), такими как "ОпределенноТип", которые используют такие инструменты, как tsd или типизация для загрузки типизирования, необходимого для вашего но они также имеют свой собственный файл "json", который необходимо поддерживать отдельно.

    • С TS2. * теперь вы можете получать зависимости определения с помощью "npm". Поэтому вместо использования отдельной библиотеки cli, такой как tsd или типизация, теперь вы можете просто использовать: npm i @types/{LIB} таким образом, все зависимости управляются с помощью package.json, и вы можете легко устранить необходимость использования другого файла "json" для поддержки в вашем проекте.


  1. 'types' - это фактические имена библиотек, которые будут найдены в typeRoot.

    • так что скажем, у вас есть настройка по умолчанию для typeRoots, которая будет выглядеть примерно так:

      "typeRoots": [
          "./node_modules/@types"
      ]
      
    • скажем, теперь вы хотите использовать жасмин в качестве тестовой среды для своего проекта, поэтому у вас есть ваша папка типаRoot, все, что вы сейчас делаете, выполняется: npm i @types/jasmine --save-dev

    • после того, как пакет определения установлен, вам просто нужно настроить свойство 'types' в 'tsconfig.json' следующим образом:

      "types": [
           "core-js",
           "jasmine",
           "requirejs",
           "chance"
      ]
      

В заключение, в основном вы говорите TS-компилятору следующее:

typeRoots: вам нужно искать типизацию в этих папках. types: В одной из приведенных выше папок вы найдете определения для этих фреймворков (подпапок).

Итак, используя описанный выше сценарий, и если мы добавим еще один корень:

"typeRoots": [
    "./node_modules/@types",
    "./custom_definitions"
],
"types": [
    "jasmine",
]

Теперь TS будет искать файлы определений в

./node_modules/@types/jasmine

или

./custom_definitions/jasmine

Надеюсь, это поможет!

Ответ 2

Вам необязательно поле типов. Вот важная часть, которую следует отметить из документации:

По умолчанию все видимые пакеты "@types" включены в ваш сборник. Пакеты в node_modules/@типах любой закрывающей папки считаются видимыми

Итак, если вы соблюдали соглашение или использовали набор инструментов, такой как npm для загрузки пакетов @types, вам не нужно настраивать typeRoots или типы в вашем как он будет работать из коробки со структурой папок по умолчанию.