Машинописный текст: не удается найти пространство имен

У меня есть следующий простой код NodeJS:

const express = require('express');

const server: express.Application = express();

Я добавляю Typescript в свой проект и новичок в этом, так что простите меня. С приведенным выше кодом я получаю следующие проблемы/ошибки:

Для требования:

var require: NodeRequire (id: string) => any (+1 overload)
'require' call may be converted to an import.

Для использования express.Application:

Cannot find namespace 'express'.

Если я переключаю «требовать» на «импорт», он исправляет ошибку пространства имен, но больше не является допустимым кодом узла, поэтому не запускается (выдает новую ошибку о неожиданном токене для импорта).

Как правильно написать такой код Node с помощью Typescript, чтобы избежать этих ошибок?

Мой tsconfig.json выглядит так:

{
  "compilerOptions": {
    "allowJs": true,
    "allowSyntheticDefaultImports": true,
    "alwaysStrict": true,
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "jsx": "preserve",
    "lib": ["dom", "es2017"],
    "module": "esnext",
    "moduleResolution": "node",
    "noEmit": true,
    "noFallthroughCasesInSwitch": true,
    "noImplicitReturns": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "removeComments": true,
    "resolveJsonModule": true,
    "sourceMap": true,
    "strict": true,
    "target": "esnext",
  },
  "exclude": ["node_modules"],
}

Как устроен ваш проект; что в tsconfig.json?

jonrsharpe 28.05.2019 13:27

Попробуйте declare function require(name:string); вверху. Typescript не поддерживает требование по умолчанию

Deckerz 28.05.2019 13:28

@jonrsharpe Я обновил свой вопрос с помощью tsconfig

CaribouCode 28.05.2019 13:31

@Deckerz Должен ли я тогда делать это в каждом файле Node, который я использую? Это кажется раздражающим, если так.

CaribouCode 28.05.2019 13:38

npm i @types/express... для определения машинописного текста. это должно исправить «Не удается найти пространство имен« экспресс »».

Juraj Kocan 28.05.2019 14:30

@JurajKocan К сожалению, это не помогло удалить эту ошибку.

CaribouCode 28.05.2019 15:04

хм, это странно... не могли бы вы поделиться репозиторием?

Juraj Kocan 28.05.2019 16:12
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
14
7
22 167
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Возможно, вам нужно использовать импорт вместо требовать:

import * as express from 'express';

ОП уже написал в своем вопросе, что это исправит ошибку, но больше не является допустимым кодом узла, поэтому возникает еще одна ошибка.

Björn Böing 28.05.2019 13:31

Это вызывает ошибку Typescript в Express() из Cannot invoke an expression whose type lacks a call signature. Type 'typeof e' has no compatible call signatures, а также когда я пытаюсь запустить код, поскольку импорт не является допустимым кодом NodeJS, он все равно не будет работать.

CaribouCode 28.05.2019 13:39
Ответ принят как подходящий

Потратив много времени, выясняется, что это произошло из-за настройки module в файле tsconfig, которая должна быть:

"module": "commonjs"

Это означает, что Typescript будет выводить обычные модули js вместо модулей ES6, что означает, что код будет работать правильно как код NodeJS. Поэтому я смог изменить требование импорта, поскольку оно компилируется.

на случай, если разработчик реакции окажется здесь, моя проблема заключалась в том, что у меня был JSX в файле, и мне пришлось изменить расширение с ts на tsx.

a2f0 27.05.2021 01:56

@ a2f0 У меня сработало. Может быть, достойным собственного ответа?

Joe Sadoski 17.09.2021 17:53

Если вы являетесь разработчиком React, который оказался здесь, как и я, — если в файле есть синтаксис JSX, попробуйте изменить расширение файла с .ts на .tsx.

Тонна "спасибо"

Mark Okhman 05.02.2022 08:49

Другие вопросы по теме