Buduję aplikację węzła, a wewnątrz każdego pliku w .js używam do tego wymagania w różnych pakietach.
let co = require("co");
Ale dostaję
itd. Więc używając maszynopisu wydaje się, że może istnieć tylko jedna taka deklaracja / wymaganie w całym projekcie? Jestem zdezorientowany, ponieważ myślałem, że let
zakres dotyczy bieżącego pliku.
Właśnie miałem projekt, który działał, ale po refaktorze teraz pojawiają się te błędy w każdym miejscu.
Czy ktoś może wyjaśnić?
typescript
require
dcsan
źródło
źródło
const fs = require('fs')
daje podobny błąd, więc nie jestem pewien, z której biblioteki to zaimportować ...Odpowiedzi:
Jeśli chodzi o sam błąd,
let
służy do deklarowania zmiennych lokalnych , które istnieją w zakresach bloków, a nie w zakresach funkcji. Jest też bardziej rygorystyczny niżvar
, więc nie możesz robić takich rzeczy:if (condition) { let a = 1; ... let a = 2; }
Zauważ również, że
case
klauzule wewnątrzswitch
bloków nie tworzą własnych zakresów bloków, więc nie możesz ponownie zadeklarować tej samej zmiennej lokalnej w wielucase
s bez użycia{}
do utworzenia każdego bloku.Jeśli chodzi o import, prawdopodobnie otrzymujesz ten błąd, ponieważ TypeScript nie rozpoznaje twoich plików jako rzeczywistych modułów i pozornie definicje na poziomie modelu stają się dla niego definicjami globalnymi.
Spróbuj zaimportować moduł zewnętrzny w standardowy sposób ES6 , który nie zawiera wyraźnego przypisania i powinien sprawić, że TypeScript poprawnie rozpozna twoje pliki jako moduły:
import * as co from "./co"
Będzie to nadal skutkować błędem kompilacji, jeśli masz już coś nazwanego
co
, zgodnie z oczekiwaniami. Na przykład będzie to błąd:import * as co from "./co"; // Error: import definition conflicts with local definition let co = 1;
Jeśli pojawia się błąd „nie można znaleźć modułu co” ...
TypeScript uruchamia pełne sprawdzanie typu względem modułów, więc jeśli nie masz definicji TS dla modułu, który próbujesz zaimportować (np. Ponieważ jest to moduł JS bez plików definicji), możesz zadeklarować swój moduł w
.d.ts
pliku definicji, który nie nie zawierają eksportu na poziomie modułu:declare module "co" { declare var co: any; export = co; }
źródło
typings install co
co dajeUnable to find "co" in the registry
. jakieś inne pomysły?./co
zamiast tegoco
, jeśli co.ts znajduje się w tym samym folderze (lub skompilowanym wyjściu, co.js).Najlepsze wyjaśnienie, jakie mogłem uzyskać, pochodzi z postu Tamasa Piro .
TLDR; TypeScript używa typów DOM dla globalnego środowiska wykonawczego. W twoim przypadku globalny obiekt okna ma właściwość „co”.
Aby rozwiązać ten problem:
export {};
Edytuj plik tsconfig.json w katalogu projektu TypeScript.
{ "compilerOptions": { "lib": ["es6"] } }
źródło
export {}
rozwiązało problem, jednak dodawanie"compilerOptions": { "lib": ["es6"] }
NIE wydaje się pomagać ani podczas kompilacji, ani w VSCode.Otrzymałem ten podobny błąd podczas kompilowania mojej aplikacji Node.JS Typescript:
node_modules/@types/node/index.d.ts:83:15 - error TS2451: Cannot redeclare block-scoped variable 'custom'.
Poprawka polegała na usunięciu tego:
"files": [ "./node_modules/@types/node/index.d.ts" ]
i zastąpić to tym:
"compilerOptions": { "types": ["node"] }
źródło
Użyj
IIFE(Immediately Invoked Function Expression)
, IIFE(function () { all your code is here... })();
źródło
const expect = chai.expect;
użycie testów Cucumber w projekcie Angular 5).Dla tych, którzy przyjeżdżają tutaj w tym wieku, oto proste rozwiązanie tego problemu. Przynajmniej zadziałało dla mnie na zapleczu. Nie sprawdziłem kodu frontendu.
Poprostu dodaj:
export {};
u góry twojego kodu.
Podziękowania dla EUGENE MURAVITSKY
źródło
Mam ten sam problem, a moje rozwiązanie wygląda tak:
// *./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(); } } }
Teraz możemy go używać po stronie serwera:
// *./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());
A także po stronie klienta:
// *./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
I oczywiście plik łykowy do tego wszystkiego:
// *./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); })
Zaktualizowano. Oczywiście nie jest konieczne oddzielne kompilowanie plików maszynopisu.
runSequence(['ts1', 'ts2', 'ts3'], 'browserify', callback)
działa idealnie.źródło
Otrzymałem ten błąd podczas aktualizacji
gulp-maszynopis 3.0.2 → 3.1.0
Przywrócenie wersji 3.0.2 naprawiło to
źródło
W moim przypadku
tsconfig.json
rozwiązany problem:{ "compilerOptions": { "esModuleInterop": true, "target": "ES2020", "moduleResolution": "node" } }
Nie powinno być
type
:module
wpackage.json
.źródło