typescript: vad är skillnaden mellan import och var


Jag har två filer i samma mapp:

/src/routes/file1.ts

/src/routes/file2.ts

file1.ts

function greet(name: srting){
   return 'Hello +' name
} 

export = greet;

file2.ts (refererar till file1)

var f2 = require('./file1');

function another_greeting(name: string)
{
    return f1.greet(name) + name;
}  

exports f2;

Denna konfiguration fungerar, inget problem. Men om jag i fil2 pekar på fil1 på det här sättet

import f1 = require('./file1')

kompilatorn klagar med fel: Kan inte hitta modulen './file1' Detta får mig att fråga: vad är skillnaden mellan att importera en extern fil med "import"-satsen och "var"-satsen?

Svar #1

Den grundläggande skillnaden är att när du använder import så kontrollerar TypeScript-kompilatorn (TSC) om filen ./file1 kan hittas baserat på TypeScript-kompilatorns konfiguration (jag menar främst --module-flaggan)! Om du bara använder var f2=require('./file1'); gör TypeScript ingen sådan kontroll.

Du kan se från tester hur nyckelordet import transpileras av TSC för commonjs-moduler och för AMD-moduler:

CommonJS: https://github.com/Microsoft/TypeScript/blob/master/tests/baselines/reference/commonjsSafeImport.js

AMD: https://github.com/Microsoft/TypeScript/blob/master/tests/baselines/reference/amdImportNotAsPrimaryExpression.js

Det finns många andra tester i mappen tests/baselines/reference.

Så i ditt fall bör import översättas till var.

Och varför fungerar det inte? Tja, följande fungerar på min dator:

file1.ts:

function greet(name: string){
    return 'Hello ' + name;
}

export = greet;

file2.ts:

import f1 = require('./file1');

function another_greeting(name: string)
{
    return f1(name) + name;
}

console.log(another_greeting('test'));

Jag kompilerar skripten så här:

c:\Work\TypeScript-playground>tsc --module commonjs --target es5 file2.ts

och kör så här:

c:\Work\TypeScript-playground>node file2.js

Svar #2

Jag kunde äntligen felsöka min .ts-fil i Chrome, och träffa normalt mina brytpunkter inne i .ts-filen genom att följa detta förslag Hur kan jag felsöka modulär TypeScript med källkartor? och det fungerar verkligen bra. Det är sorgligt att se att Microsoft inte har tillhandahållit ett ordentligt verktyg för att felsöka sin egen teknik medan Google kan göra det.