javascript - დუბლირებული იდენტიფიკატორის შეცდომა d.ts ფაილთან და nodejs require-სთან იგივე სახელით
ახლა დარწმუნებული ვარ, რომ პრობლემა შეექმნა იმიტომ, რომ არსებობს d.ts ფაილი, რომელიც შეიცავს მოდულს სახელად "Shared", და require გამოთქმა, რომელიც შეიცავს იგივე სახელის ცვლადს, თუ ის გამოიყენება NodeJS გარემოში.
// shared.d.ts
declare module Shared { ... }
// other_module.ts
/// <reference path="shared.d.ts"/>
if(require) { var Shared = require("shared"); }
export class Something {
public someVar = new Shared.SomethingElse("blah");
}
როცა ვკომპილირებ other_module.ts (რომელიც ფაქტობრივად არის უამრავი განცალკევებული ფაილი), მატებს შეცდომას, რომ Shared არის დუბლირებული იდენტიფიკატორი, რაც მე შემიძლია ავუხსნა იმით, რომ TS ფიქრობს, Shared არის მოდული, მაგრამ შემდეგ ეუბნობა, რომ ის არის require-ის დაბრუნება.
პრობლემა აქ არის ის, რომ მოდულების გამომავალი მონაცემები უნდა იყოს თავსებადი nodeJS-ის require სისტემასთან, შესაბამისად, ამ შემთხვევაში, როდესაც other_module მოთხოვნადია, ის იქნება თავის ინდივიდუალურ სფერში და ვერ გაიგებს Shared.SomethingElse-ის შესახებ. ამიტომ, require აუცილებელია, რათა other_module-ის შიდა მოდულებმა შეძლონ Shared ბიბლიოთეკის გამოყენება, მაგრამ ბრაუზერის გარემოში, ის მიიღეს გლობალური სტრუქტურის Shared.SomethingElse მეშვეობით.
თუ მე ამოვხსნი რეფერენსს, ფაილი ვერ შეიკომპილირდება, რადგან მას არ ახსოვს Shared, თუ მე ავაცილებ require-ს როცა მოდული ჩაიტვირთება nodejs-ში (var otherModule=require("other_module")) ის უკმაყოფილო იქნება, რადგან მას არ ახსოვს Shared. არის რაიმე გზა ამის გამოსასწორებლად?
პასუხი #1
პირველი შეცდომა
დუბლიკირებული იდენტიფიკატორი, იმიტომ რომ თქვენ გაქვთ Shared ფაილში shared.d.ts + ფაილშიც other_module.ts.
გაასწორე A, იყოს სრულიად გარე
თუ გსურთ გამოიყენოთ amd/commonjs ანუ გარე მოდულები, საჭიროა გამოიყენოთ import/require (არ var/require, როგორც ახლა აკეთებთ). import-ის გამოყენება ქმნის ახალ ცვლადის დეკლარაციის სივრცეს და შესაბამისად თქვენ აღარ დაბინძურებთ გლობალურ ნეიმსპეისს Shared other_module.ts-დან. მოკლედ :
// shared.d.ts
declare module Shared {
export function SomethingElse(arg:string):any;
}
declare module 'shared'{
export = Shared;
}
და ტიპურად უსაფრთხო იმპორტი:
// other_module.ts
/// <reference path="shared.d.ts"/>
import Shared = require("shared");
export class Something {
public someVar = new Shared.SomethingElse("blah");
}
დაასწორე B, როგორც იყავი, მაგრამ მაშინ სხვა სახელი უნდა გამოიყენო
შიგნით other_module ადგილობრივად არ გამოიყენოთ სახელი Shared, თუ ადგილობრივი მასშტაბი გლობალური მასშტაბია. გირჩევთ უბრალოდ ყველგან გამოიყენოთ external და შეადგინოთ node-ისთვის commonjs და ბრაუზერისთვის amd როგორც ნაჩვენებია გამოსწორება A-ში, მაგრამ თუ აუცილებელია, აქ არის შედგენილი გამოსწორებული other_module.ts.
// other_module.ts
/// <reference path="shared.d.ts"/>
var fooShared: typeof Shared;
if(require) { fooShared = require("shared"); }
else { fooShared = Shared; }
export class Something {
public someVar = new fooShared.SomethingElse("blah");
}
