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"
  ]
}

Aiheeseen liittyviä artikkeleita