Kuinka käyttää nimiavaruuksia importin kanssa TypeScriptissä
Minulla on kaksi luokkaa kahdessa erillisessä tiedostossa, ja yksi perii toisesta. Perusluokka sisältää joitakin import-lauseita, jotka käyttävät node-moduuleja. Minulle ei ole selvää, miksi johdettu luokka (joka on erillisessä tiedostossa) ei tunnista perusluokkaa!!!???
Voisiko joku selventää tätä, kiitos?
// 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);
}
}
}
Ja sitten
// UtilOne.ts
/// <reference path="UtilBase.ts" />
namespace My.utils {
export class UtilOne extends My.utils.UtilBase {
}
}
Käännöksen jälkeen saan:
src/UtilOne.ts(6,47): error TS2339: Property 'UtilBase' does not
exist on type 'typeof utils'
Vastaus #1
Ratkaisu, jossa on nimialueet (ei suositella)
Ratkaistaksesi ongelmasi voit viedä nimialueesi:
// UtilBase.ts
import * as path from "path";
export namespace My.utils {
export class UtilBase {
protected fixPath(value: string): string {
return value.replace('/', path.sep);
}
}
}
Sitten sinun pitäisi pystyä tuomaan se:
// UtilOne.ts
import {My} from './UtilBase';
namespace My.utils {
export class UtilOne extends My.utils.UtilBase {
}
}
Kuitenkin, jos tarkoituksena on järjestää koodia, on huono käytäntö käyttää namespaces ja (ES6) modules samaan aikaan. Node.js:n kanssa tiedostosi ovat moduuleja, joten sinun tulisi välttää namespacesin käyttöä.
Käytä ES6-moduuleja ilman nimialueita
TypeScript tukee ES6-moduulien syntaksia erittäin hyvin:
// 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 {
}
Se on suositeltu tapa. ES6-moduulit estävät nimikonfliktit mahdollistamalla jokaisen tuodun resurssin uudelleennimeämisen.
Se toimii Node.js:ssä.
Hyvän johdannon ES6-moduulien syntaksiin saat lukemalla tämän artikkelin.
Käytä tiedostoa tsconfig.json /// <reference sijaan
Huomautus: Syntaksi /// <reference on korvattu tiedostolla tsconfig.json. Esimerkki Node.js:lle:
// tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"target": "es6"
},
"exclude": [
"node_modules"
]
}
