Kako koristiti namespaceove s importom u TypeScriptu
Imam dvije klase u dvije odvojene datoteke i jedna nasljeđuje drugu. Osnovna klasa sadrži neke import izjave koje koriste node module. Nije mi jasno zašto izvedena klasa (koja je u zasebnoj datoteci) ne prepoznaje osnovnu klasu!!!???
Može li netko ovo pojasniti, molim?
// UtilBase.ts
/// <reference path="../typings/node.d.ts" />
/// <reference path="../typings/packages.d.ts" />
import * as path from "path"; // <---- THIS LINE BREAKS THE BUILD!!!!
namespace My.utils {
export class UtilBase {
protected fixPath(value: string): string {
return value.replace('/', path.sep);
}
}
}
I onda
// UtilOne.ts
/// <reference path="UtilBase.ts" />
namespace My.utils {
export class UtilOne extends My.utils.UtilBase {
}
}
Nakon kompajliranja dobivam:
src/UtilOne.ts(6,47): error TS2339: Property 'UtilBase' does not
exist on type 'typeof utils'
Odgovor #1
Rješenje s prostornim imenima (nije preporučeno)
Za rješavanje vašeg problema, možete izvesti vaš namespace:
// UtilBase.ts
import * as path from "path";
export namespace My.utils {
export class UtilBase {
protected fixPath(value: string): string {
return value.replace('/', path.sep);
}
}
}
Tada biste ga trebali moći uvesti:
// UtilOne.ts
import {My} from './UtilBase';
namespace My.utils {
export class UtilOne extends My.utils.UtilBase {
}
}
Međutim, ako je svrha organizirati kod, loša je praksa koristiti prostore imena i (ES6) module istovremeno. S Node.js-om, vaši su datoteke moduli, pa biste trebali izbjegavati prostore imena.
Koristite ES6 module bez prostora imena
TypeScript vrlo dobro podržava sintaksu ES6 modula:
// UtilBase.ts
import * as path from "path";
export default class UtilBase {
protected fixPath(value: string): string {
return value.replace('/', path.sep);
}
}
// UtilOne.ts
import UtilBase from './UtilBase';
export default class UtilOne extends UtilBase {
}
To je preporučeni način. ES6 moduli sprječavaju sukobe imena s mogućnošću preimenovanja svakog uvezenog resursa.
Radit će na Node.js-u.
Za dobar uvod u sintaksu ES6 modula, pročitajte ovaj članak.
Koristite datoteku tsconfig.json umjesto /// <reference
Napomena: Sintaksa /// <reference zamijenjena je datotekom tsconfig.json. Primjer za Node.js:
// tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"target": "es6"
},
"exclude": [
"node_modules"
]
}
