#node.js #typescript
#node.js #typescript
Вопрос:
Я начинаю переделывать инструмент для TypeScript, и пока мне это нравится. Тем не менее, я все еще сталкиваюсь с загадочным поведением, которое заставляет меня думать, что я что-то упускаю. Например, я столкнулся с «неявной ошибкой типа «любой» (у меня есть strict: true
, и я этого хочу), которая, насколько я могу судить, должна быть покрыта @types/node
. Конечно, я могу это исправить, явно введя его, но я хочу знать, почему ввод из @types/node
не распознается.
- Создать
package.json
:npm init -y
(не обязательно, но полезно) - Установите TypeScript, Node 12 tsconfig по умолчанию и типы узлов:
npm i -D typescript @tsconfig/node12 @types/node
- Создать
tsconfig.json
(см. Ниже) - Создать
src/demo.ts
(см. Ниже) - Выполнить
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!