У меня есть следующий простой код 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"],
}
Попробуйте declare function require(name:string);
вверху. Typescript не поддерживает требование по умолчанию
@jonrsharpe Я обновил свой вопрос с помощью tsconfig
@Deckerz Должен ли я тогда делать это в каждом файле Node, который я использую? Это кажется раздражающим, если так.
npm i @types/express... для определения машинописного текста. это должно исправить «Не удается найти пространство имен« экспресс »».
@JurajKocan К сожалению, это не помогло удалить эту ошибку.
хм, это странно... не могли бы вы поделиться репозиторием?
Возможно, вам нужно использовать импорт вместо требовать:
import * as express from 'express';
ОП уже написал в своем вопросе, что это исправит ошибку, но больше не является допустимым кодом узла, поэтому возникает еще одна ошибка.
Это вызывает ошибку Typescript в Express() из Cannot invoke an expression whose type lacks a call signature. Type 'typeof e' has no compatible call signatures
, а также когда я пытаюсь запустить код, поскольку импорт не является допустимым кодом NodeJS, он все равно не будет работать.
Потратив много времени, выясняется, что это произошло из-за настройки module
в файле tsconfig, которая должна быть:
"module": "commonjs"
Это означает, что Typescript будет выводить обычные модули js вместо модулей ES6, что означает, что код будет работать правильно как код NodeJS. Поэтому я смог изменить требование импорта, поскольку оно компилируется.
на случай, если разработчик реакции окажется здесь, моя проблема заключалась в том, что у меня был JSX в файле, и мне пришлось изменить расширение с ts на tsx.
@ a2f0 У меня сработало. Может быть, достойным собственного ответа?
Если вы являетесь разработчиком React, который оказался здесь, как и я, — если в файле есть синтаксис JSX, попробуйте изменить расширение файла с .ts
на .tsx
.
Тонна "спасибо"
Как устроен ваш проект; что в
tsconfig.json
?