Подтвердить что ты не робот

Не может переопределить переменную области с областью (typescript)

Я создаю приложение node и внутри каждого файла в .js, который используется для выполнения этого запроса в различных пакетах.

let co = require("co");

Но получение

введите описание изображения здесь

и т.д.. Таким образом, используя typescript, кажется, что может быть только одно такое объявление/требование во всем проекте? Я смущен этим, так как я думал, что let был привязан к текущему файлу.

У меня только был проект, который работал, но после того, как рефакторинг теперь получает эти ошибки повсюду.

Может кто-нибудь объяснить?

4b9b3361

Ответ 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' для объекта глобального окна.

Чтобы решить это:

  1. Переименуйте переменную или
  2. Используйте модули TypeScript и добавьте пустой экспорт {}:
export{};

или же

  1. Настройте параметры вашего компилятора, не добавляя наборы 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 исправлено его