Типы узлов из @types / node применяются не так, как ожидалось

#node.js #typescript

#node.js #typescript

Вопрос:

Я начинаю переделывать инструмент для TypeScript, и пока мне это нравится. Тем не менее, я все еще сталкиваюсь с загадочным поведением, которое заставляет меня думать, что я что-то упускаю. Например, я столкнулся с «неявной ошибкой типа «любой» (у меня есть strict: true , и я этого хочу), которая, насколько я могу судить, должна быть покрыта @types/node . Конечно, я могу это исправить, явно введя его, но я хочу знать, почему ввод из @types/node не распознается.

  1. Создать package.json : npm init -y (не обязательно, но полезно)
  2. Установите TypeScript, Node 12 tsconfig по умолчанию и типы узлов: npm i -D typescript @tsconfig/node12 @types/node
  3. Создать tsconfig.json (см. Ниже)
  4. Создать src/demo.ts (см. Ниже)
  5. Выполнить tsc : ./node_modules/.bin/tsc

tsconfig.json :

 {
  "extends": "@tsconfig/node12/tsconfig.json",
  "compilerOptions": {
    "outDir": "./build",
    "rootDir": "./src"
  }
}
  

src/demo.ts :

 const http = require('http')

http.get('http://google.com', res => console.log(res))
  

Выполнение этих шагов приводит к ошибке следующего типа:

 src/demo.ts:3:31 - error TS7006: Parameter 'res' implicitly has an 'any' type.

3 http.get('http://google.com', res => console.log(res))
  

Если я чего-то не упустил, ввод @types/node текста должен быть в состоянии определить, что res это тип IncomingMessage . Из строки 403 http.d.ts (отформатировано для SO):

 function get(
  options: RequestOptions | string | URL,
  callback?: (res: IncomingMessage) => void
): ClientRequest;
  

Я заглянул typeRoots в tsconfig.json , и в документации TS указано, что в этом нет необходимости (типы должны быть найдены автоматически node_modules ). Я тоже /// <reference types="node" /> пытался безрезультатно.

Я хотел бы понять, почему ref не распознается как тип IncomingMessage .

Версии пакетов:

  • @tsconfig/node12: ^1.0.7
  • @types/node: ^14.11.10
  • @types/typescript: ^4.0.3

Ответ №1:

Типы для импортированных модулей не вступают в силу, если вы не используете импорт ES. Измените неправильный код на правильный код, как показано ниже:

Неправильно

 const http = require('http')

http.get('http://google.com', res => console.log(res))
  

Правильно

 import * as http from 'http'

http.get('http://google.com', res => console.log(res))
  

Комментарии:

1. Ах, это объясняет, что … это действительно приятно знать, спасибо!

2. Мне хочется, чтобы TypeScript предупреждал меня об импорте CJS!