Не может переопределить переменную области с областью (typescript)
Я создаю приложение node и внутри каждого файла в .js, который используется для выполнения этого запроса в различных пакетах.
let co = require("co");
Но получение
![введите описание изображения здесь]()
и т.д.. Таким образом, используя typescript, кажется, что может быть только одно такое объявление/требование во всем проекте?
Я смущен этим, так как я думал, что let
был привязан к текущему файлу.
У меня только был проект, который работал, но после того, как рефакторинг теперь получает эти ошибки повсюду.
Может кто-нибудь объяснить?
Ответы
Ответ 1
Что касается самой ошибки, let
используется для объявления локальных переменных, которые существуют в областях блоков вместо областей функций. Это также более строгое, чем var
, поэтому вы не можете делать такие вещи:
if (condition) {
let a = 1;
...
let a = 2;
}
Также обратите внимание, что предложения case
внутри блоков switch
не создают свои собственные области видимости блоков, поэтому вы не можете повторно объявить одну и ту же локальную переменную в нескольких case
без использования {}
для создания каждого блока.
Что касается импорта, вы, вероятно, получаете эту ошибку, потому что TypeScript не распознает ваши файлы как фактические модули, и, казалось бы, определения на уровне модели в конечном итоге становятся глобальными определениями для него.
Попробуйте импортировать внешний модуль стандартным способом ES6, который не содержит явного назначения и должен заставить TypeScript правильно распознавать ваши файлы как модули:
import * as co from "./co"
Это все равно приведет к ошибке компиляции, если у вас уже есть что-то с именем co
, как и ожидалось. Например, это будет ошибка:
import * as co from "./co"; // Error: import definition conflicts with local definition
let co = 1;
Если вы получаете сообщение об ошибке "не могу найти модуль co"...
TypeScript выполняет полную проверку типов для модулей, поэтому, если у вас нет определений TS для модуля, который вы пытаетесь импортировать (например, потому что это модуль JS без файлов определений), вы можете объявить свой модуль в .d.ts
файл определения, который не содержит экспорт уровня модуля:
declare module "co" {
declare var co: any;
export = co;
}
Ответ 2
Лучшее объяснение, которое я мог получить, от почты Тамаса Пиро.
TL;DR; TypeScript использует наборы DOM для глобальной среды выполнения. В вашем случае есть свойство 'co' для объекта глобального окна.
Чтобы решить это:
- Переименуйте переменную или
- Используйте модули TypeScript и добавьте пустой экспорт {}:
export{};
или же
- Настройте параметры вашего компилятора, не добавляя наборы DOM:
Отредактируйте tsconfig.json в каталоге проекта TypeScript.
{
"compilerOptions": {
"lib": ["es6"]
}
}
Ответ 3
Используйте IIFE(Immediately Invoked Function Expression)
, IIFE
(function () {
all your code is here...
})();
Ответ 4
Я получал такую же ошибку при компиляции моего приложения Tydescript Node.JS:
node_modules/@types/node/index.d.ts:83:15 - error TS2451: Cannot redeclare block-scoped variable 'custom'.
Исправление должно было удалить это:
"files": [
"./node_modules/@types/node/index.d.ts"
]
и заменить его следующим:
"compilerOptions": {
"types": ["node"]
}
Ответ 5
У меня такая же проблема, и мое решение выглядит так:
// *./module1/module1.ts*
export module Module1 {
export class Module1{
greating(){ return 'hey from Module1'}
}
}
// *./module2/module2.ts*
import {Module1} from './../module1/module1';
export module Module2{
export class Module2{
greating(){
let m1 = new Module1.Module1()
return 'hey from Module2 + and from loaded Model1: '+ m1.greating();
}
}
}
Теперь мы можем использовать его на стороне сервера:
// *./server.ts*
/// <reference path="./typings/node/node.d.ts"/>
import {Module2} from './module2/module2';
export module Server {
export class Server{
greating(){
let m2 = new Module2.Module2();
return "hello from server & loaded modules: " + m2.greating();
}
}
}
exports.Server = Server;
// ./app.js
var Server = require('./server').Server.Server;
var server = new Server();
console.log(server.greating());
И на стороне клиента тоже:
// *./public/javscripts/index/index.ts*
import {Module2} from './../../../module2/module2';
document.body.onload = function(){
let m2 = new Module2.Module2();
alert(m2.greating());
}
// ./views/index.jade
extends layout
block content
h1= title
p Welcome to #{title}
script(src='main.js')
//
the main.js-file created by gulp-task 'browserify' below in the gulpfile.js
И, конечно, gulp файл для всего этого:
// *./gulpfile.js*
var gulp = require('gulp'),
ts = require('gulp-typescript'),
runSequence = require('run-sequence'),
browserify = require('gulp-browserify'),
rename = require('gulp-rename');
gulp.task('default', function(callback) {
gulp.task('ts1', function() {
return gulp.src(['./module1/module1.ts'])
.pipe(ts())
.pipe(gulp.dest('./module1'))
});
gulp.task('ts2', function() {
return gulp.src(['./module2/module2.ts'])
.pipe(ts())
.pipe(gulp.dest('./module2'))
});
gulp.task('ts3', function() {
return gulp.src(['./public/javascripts/index/index.ts'])
.pipe(ts())
.pipe(gulp.dest('./public/javascripts/index'))
});
gulp.task('browserify', function() {
return gulp.src('./public/javascripts/index/index.js', { read: false })
.pipe(browserify({
insertGlobals: true
}))
.pipe(rename('main.js'))
.pipe(gulp.dest('./public/javascripts/'))
});
runSequence('ts1', 'ts2', 'ts3', 'browserify', callback);
})
Обновленный.
Разумеется, не требуется разделять файлы typescript отдельно.
runSequence(['ts1', 'ts2', 'ts3'], 'browserify', callback)
работает отлично.
Ответ 6
Я получил эту ошибку при обновлении
gulp - typescript 3.0.2 → 3.1.0
Вернемся к 3.0.2 исправлено его