ब्लॉक स्कोपेड वैरिएबल (टाइपस्क्रिप्ट) को फिर से सूचीबद्ध नहीं कर सकता


99

मैं एक नोड ऐप बना रहा हूं, और प्रत्येक फ़ाइल के अंदर .js को विभिन्न पैकेजों में आवश्यकता के लिए ऐसा करने के लिए उपयोग किया जाता है।

let co = require("co");

लेकिन हो रही है

यहाँ छवि विवरण दर्ज करें

इसलिए टाइपस्क्रिप्ट का उपयोग करने से ऐसा लगता है कि पूरे प्रोजेक्ट में केवल एक ही ऐसी घोषणा / आवश्यकता हो सकती है? मैं इस बारे में उलझन में हूं क्योंकि मुझे लगा letकि वर्तमान फ़ाइल में स्कूप किया गया था।

मेरे पास बस एक प्रोजेक्ट था जो काम कर रहा था लेकिन एक रिफ्लेक्टर के बाद अब मुझे ये गलतियाँ पूरी जगह मिल रही हैं।

क्या कोई समझा सकता है?


1
इस बारे में कैसे - चलो co_module = आवश्यकता ("co"); मैंने कुछ इसी तरह का सामना किया और इस त्रुटि को हल किया।
tyrion

1
यह एक टाइप बग है। मैंने यहां एक न्यूनतम उदाहरण बनाया है: gist.github.com/rjmunro/428ec644b6e53a499ca3a5ba8de2edc7
rjmunro

5
2.5 साल बाद और मैं अपने सवाल पर वापस आ गया हूं, यह अभी भी एक समस्या है। नोड निर्मित इन्स के साथ इस बार। const fs = require('fs')इसी तरह की त्रुटि देता है तो यह सुनिश्चित करने के लिए क्या पुस्तकालय से आयात करने के लिए नहीं ...
dcsan

तथ्य टीएस अभी भी यह हास्यास्पद है
जीएन।

जवाबों:


67

त्रुटि के बारे में, स्थानीय वेरिएबल्स letको घोषित करने के लिए उपयोग किया जाता है जो फ़ंक्शन स्कॉप्स के बजाय ब्लॉक स्कोप में मौजूद हैं । यह भी से अधिक सख्त है , इसलिए आप इस तरह से सामान नहीं कर सकते हैं:var

if (condition) {
    let a = 1;
    ...
    let a = 2;
}

यह भी ध्यान दें कि ब्लॉक के caseअंदर क्लॉस switchअपने स्वयं के ब्लॉक स्कोप नहीं बनाते हैं, इसलिए आप प्रत्येक ब्लॉक बनाने के लिए caseउपयोग किए बिना कई एस में एक ही स्थानीय चर को फिर से व्यवस्थित नहीं कर सकते {}


आयात के लिए, आपको संभवतः यह त्रुटि मिल रही है क्योंकि टाइपस्क्रिप्ट आपकी फ़ाइलों को वास्तविक मॉड्यूल के रूप में नहीं पहचानता है, और प्रतीत होता है कि मॉडल-स्तरीय परिभाषाएं इसके लिए वैश्विक परिभाषाएं हैं।

एक बाहरी मॉड्यूल को मानक ES6 तरीके से आयात करने का प्रयास करें , जिसमें कोई स्पष्ट असाइनमेंट नहीं है, और टाइपस्क्रिप्ट को आपकी फ़ाइलों को मॉड्यूल के रूप में सही ढंग से पहचानना चाहिए:

import * as co from "./co"

यदि आप coपहले से ही कुछ नाम रखते हैं , तो भी यह एक संकलित त्रुटि होगी। उदाहरण के लिए, यह एक त्रुटि होने जा रही है:

import * as co from "./co"; // Error: import definition conflicts with local definition
let co = 1;

यदि आपको एक त्रुटि मिल रही है "मॉड्यूल सह नहीं मिल रहा है" ...

टाइपस्क्रिप्ट मॉड्यूल के खिलाफ पूर्ण प्रकार की जाँच कर रहा है, इसलिए यदि आपके पास उस मॉड्यूल के लिए TS परिभाषाएँ नहीं हैं जिन्हें आप आयात करने का प्रयास कर रहे हैं (जैसे कि यह परिभाषा फ़ाइलों के बिना JS मॉड्यूल है), तो आप अपने मॉड्यूल को परिभाषा फ़ाइल में घोषित कर सकते हैं .d.tsजो doesn मॉड्यूल-स्तरीय निर्यात शामिल नहीं हैं:

declare module "co" {
    declare var co: any;
    export = co;
}

9
यह "मॉड्यूल सह नहीं पा सकता है" देता है। मैंने भी कोशिश की typings install coजो देता है Unable to find "co" in the registry। कोई अन्य विचार?
dcsan

मैं @dcsan के समान ही मुद्दा रख रहा हूं, यह कहता है कि यह मॉड्यूल को नहीं ढूंढ सकता है, हालांकि मुझे स्पष्ट रूप से यह npm स्थापित है।
justin.m.chase

यह सापेक्ष पथ के कारण हो सकता है। मैं NodeJS मॉड्यूल प्रबंधन से परिचित नहीं हूं, लेकिन आवश्यकताएँJJ में यदि मॉड्यूल अपेक्षाकृत संदर्भित हैं, तो वर्तमान फ़ोल्डर को स्पष्ट रूप से निरूपित किया जाना चाहिए। यही कारण है, ./coके बजाय coअगर co.ts एक ही फ़ोल्डर (या संकलित उत्पादन, co.js) में है।
जॉन वीज़

1
चौकस रहें, "* जैसा कि xxx" महत्वपूर्ण है। तो, "xxx से आयात नहीं ..." लेकिन "आयात * से xxx के रूप में ..."
Nurbol Alpysbayev

27

मुझे सबसे अच्छी व्याख्या तामस पीरो की पोस्ट से मिली ।

TLDR; टाइपस्क्रिप्ट वैश्विक निष्पादन वातावरण के लिए DOM टाइपिंग का उपयोग करता है। आपके मामले में वैश्विक विंडो ऑब्जेक्ट पर एक 'सह' गुण है।

इसे हल करने के लिए:

  1. चर का नाम बदलें, या
  2. टाइपस्क्रिप्ट मॉड्यूल का उपयोग करें, और एक खाली निर्यात जोड़ें {}:
export {};

या

  1. DOM टाइपिंग न जोड़कर अपने कंपाइलर विकल्पों को कॉन्फ़िगर करें:

टाइपस्क्रिप्ट प्रोजेक्ट निर्देशिका में tsconfig.json संपादित करें।

{
    "compilerOptions": {
        "lib": ["es6"]
      }
}

यह ग्राहक पक्ष के लिए है? मेरी मूल समस्या सर्वर साइड कोड के साथ थी और मुझे नहीं लगता कि DOM कंपाइलर विकल्प का उपयोग किया जा रहा था (पुरानी परियोजना)
dcsan

1
मैं पुष्टि करता हूं कि जोड़ने export {}से मेरे लिए समस्या हल हो गई, हालांकि जोड़ना "compilerOptions": { "lib": ["es6"] }न तो संकलन के दौरान और न ही VSCode में मदद करना प्रतीत होता है।
adamsfamily 16

मूल पद का लिंक मर चुका है।
साइक्लोनोस्कोप

13

मैं अपने 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"]
}

9

का उपयोग करें IIFE(Immediately Invoked Function Expression), IIFE

(function () {
    all your code is here...

 })();

सरल। अच्छी तरह से काम। धन्यवाद! (मेरे मामले में, मैं const expect = chai.expect;कोणीय 5 परियोजना में ककड़ी परीक्षणों का उपयोग करने के लिए घोषणा कर रहा था )।
मैक्सिमे लाफारी

7

इस उम्र में यहां आने वालों के लिए, यहां इस मुद्दे का एक सरल समाधान है। इसने कम से कम मेरे लिए बैकएंड में काम किया। मैंने दृश्यपटल कोड के साथ जाँच नहीं की है।

बस जोड़ दो:

export {};

अपने कोड के शीर्ष पर।

EUGENE MURAVITSKY को क्रेडिट


1

मुझे वही समस्या मिली, और मेरा समाधान इस तरह दिखता है:

// *./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-file:

// *./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);
})

अपडेट किया गया। बेशक, यह अलग से टाइपस्क्रिप्ट फ़ाइलों को संकलित करने के लिए आवश्यक नहीं है। runSequence(['ts1', 'ts2', 'ts3'], 'browserify', callback)सही काम करता है।


7
बस अगर किसी को उस gulp फ़ाइल की क्रियाशीलता और पुनरावृत्ति द्वारा टाइपस्क्रिप्ट बंद कर दिया जाता है, तो कोई भी ऐसा नहीं करता है।
डैनियल इयरविकर

0

अपग्रेड करते समय मुझे यह त्रुटि मिली

गल्प-टाइपस्क्रिप्ट 3.0.2 → 3.1.0

3.0.2 पर वापस डालकर इसे ठीक कर दिया


0

मेरे मामले में निम्नलिखित tsconfig.jsonसमस्या हल हो गई है:

{
  "compilerOptions": {
    "esModuleInterop": true,
    "target": "ES2020",
    "moduleResolution": "node"
  }
}

कोई होना चाहिए type: moduleमें package.json

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.