ব্লক স্কোপড ভেরিয়েবল (টাইপস্ক্রিপ্ট) পুনরায় ঘোষণা করতে পারে না


99

আমি নোড অ্যাপ তৈরি করছি এবং প্রতিটি ফাইলের ভিতরে .js এ বিভিন্ন প্যাকেজগুলির প্রয়োজন হয় এটি করতে অভ্যস্ত।

let co = require("co");

কিন্তু পাচ্ছি

এখানে চিত্র বর্ণনা লিখুন

ইত্যাদি। সুতরাং টাইপসক্রিপ্ট ব্যবহার করে মনে হয় পুরো প্রকল্প জুড়ে কেবল এই জাতীয় ঘোষণা / প্রয়োজনীয়তা থাকতে পারে? আমি এই সম্পর্কে বিভ্রান্ত হয়ে পড়েছিলাম যেহেতু আমি ভেবেছিলাম letবর্তমান ফাইলটি স্কোপ করা হয়েছে।

আমার সবেমাত্র একটি প্রকল্প ছিল যা কাজ করে যাচ্ছিল তবে একটি চুল্লীর পরে এখন পুরো জায়গা জুড়ে এই ত্রুটিগুলি পাচ্ছি getting

কেউ কি ব্যাখ্যা করতে পারেন?


4
এটি সম্পর্কে কীভাবে - আসুন co_module = প্রয়োজনীয় ("কো"); আমি অনুরূপ কিছু মুখোমুখি হয়েছি এবং এটি ত্রুটির সমাধান করেছে।
tyrion

4
এটি একটি টাইপ স্ক্রিপ্ট বাগ বলে মনে হচ্ছে। আমি এখানে একটি ন্যূনতম উদাহরণ তৈরি করেছি: gist.github.com/rjmunro/428ec644b6e53a499ca3a5ba8de2edc7
rjmunro

4
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;

আপনি যদি একটি ত্রুটি পেয়ে থাকেন তবে "মডিউল সহ খুঁজে পাচ্ছেন না ... "

টাইপস্ক্রিপ্ট মডিউলগুলির বিরুদ্ধে সম্পূর্ণ টাইপ-চেকিং চলছে, সুতরাং আপনি যে মডিউলটি আমদানির চেষ্টা করছেন তার জন্য যদি আপনার টিএস সংজ্ঞা না থাকে (উদাহরণস্বরূপ এটি সংজ্ঞা ফাইল ছাড়াই একটি জেএস মডিউল), আপনি একটি সংজ্ঞা ফাইলটিতে আপনার মডিউলটি ঘোষণা করতে পারেন .d.tsযা মডিউল স্তরের রফতানির মধ্যে নেই:

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

9
এটি "মডিউল সহ খুঁজে পাচ্ছে না" দেয়। আমি চেষ্টা করে typings install coযা দেয় Unable to find "co" in the registry। অন্য কোন ধারণা?
dcsan

আমি @ ডিসিএসএনের মতো একই সমস্যা পেয়েছি এটি বলছে এটি মডিউলটি খুঁজে পাবে না যদিও আমি স্পষ্টভাবে এনটিএম ইনস্টল করেছি।
justin.m.chase

এটি হতে পারে আপেক্ষিক পথের কারণে। আমি নোডজেএস মডিউল পরিচালনার সাথে পরিচিত নই, তবে মডিউলগুলি তুলনামূলকভাবে উল্লেখ করা হলে প্রয়োজনীয় জেএস-এ, বর্তমান ফোল্ডারটি অবশ্যই স্পষ্টভাবে বর্ণিত হওয়া উচিত। এটির ./coপরিবর্তে co, যদি co.ts একই ফোল্ডারে থাকে (বা সংকলিত আউটপুট, co.js)।
জন ওয়েইজ

4
মনোযোগী হোন, "* এক্সএক্সএক্সএক্স হিসাবে" গুরুত্বপূর্ণ। সুতরাং, "থেকে
এক্সএক্সএক্সএক্স

27

তামাস পিরোর পোস্ট থেকে আমার সবচেয়ে ভাল ব্যাখ্যাটি পাওয়া গেল ।

টিএলডিআর; টাইপস্ক্রিপ্ট গ্লোবাল এক্সিকিউশন পরিবেশের জন্য ডোম টাইপগুলি ব্যবহার করে। আপনার ক্ষেত্রে বিশ্ব উইন্ডো অবজেক্টে একটি 'কো' সম্পত্তি রয়েছে।

এটি সমাধান করার জন্য:

  1. চলকটির নাম পরিবর্তন করুন, বা
  2. টাইপস্ক্রিপ্ট মডিউলগুলি ব্যবহার করুন এবং একটি খালি রফতানি যুক্ত করুন {}:
export {};

বা

  1. ডিওএম টাইপগুলি যোগ না করে আপনার সংকলক বিকল্পগুলি কনফিগার করুন:

টাইপস্ক্রিপ্ট প্রকল্প ডিরেক্টরিতে tsconfig.json সম্পাদনা করুন।

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

এই ক্লায়েন্ট পক্ষের জন্য? আমার আসল সমস্যাটি ছিল সার্ভার সাইড কোডের সাথে এবং আমি বিশ্বাস করি না যে DOM সংকলক বিকল্পগুলি ব্যবহার করা হয়েছিল (পুরানো প্রকল্প)
dcsan

4
আমি নিশ্চিত করি যে সংযোজনটি export {}আমার কাছে সমস্যার সমাধান করেছে, তবে যোগ করার ফলে "compilerOptions": { "lib": ["es6"] }ভিএসকোডেও সংকলন চলাকালীন না কোনওরকম সাহায্য হবে বলে মনে হচ্ছে না।
অ্যাডামসফ্যামিলি

মূল পোস্টের লিঙ্কটি মারা গেছে।
সাইক্লোনকোডে

13

আমার নোড.জেএস টাইপস্ক্রিপ্ট অ্যাপ্লিকেশনটি সংকলন করার সময় আমি এই জাতীয় ত্রুটিটি পেয়েছিলাম:

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), আইআইএফই

(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

এবং অবশ্যই এই সমস্তের জন্য একটি ঝিল্লি ফাইল:

// *./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
যে কোনও ব্যক্তিকে সেই গুল্প ফাইলটির ভার্বোসটি এবং পুনরাবৃত্তি দ্বারা টাইপস্ক্রিপ্ট বন্ধ করা হয়, কেউই এটি করে না।
ড্যানিয়েল আর্উইকার

0

আপগ্রেড করার সময় আমি এই ত্রুটি পেয়েছি

gulp-typcript 3.0.2 → 3.1.0

এটি 3.0.0 এ ফিরিয়ে দেওয়া এটি স্থির করে


0

আমার ক্ষেত্রে নিম্নলিখিত tsconfig.jsonসমস্যার সমাধান:

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

নেই type: moduleইন করা উচিত package.json

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.