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

Povezani članci