namespace - Cómo usar espacios de nombres con importación en TypeScript
cannot use namespace as a type (1)
Tengo dos clases en dos archivos separados y uno se extiende desde otro. La clase base contiene algunas sentencias de import
que usan módulos de nodos. No estoy seguro de por qué la clase derivada (que está en un archivo separado) no reconoce la clase base !!! ???
¿Alguien puede aclarar esto por favor?
// 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);
}
}
}
Y entonces
// UtilOne.ts
/// <reference path="UtilBase.ts" />
namespace My.utils {
export class UtilOne extends My.utils.UtilBase {
}
}
Después de compilar, obtengo:
src/UtilOne.ts(6,47): error TS2339: Property ''UtilBase'' does not
exist on type ''typeof utils''
Una solución con espacios de nombres (no recomendado)
Para resolver su problema, puede exportar su espacio de nombres:
// UtilBase.ts
import * as path from "path";
export namespace My.utils {
export class UtilBase {
protected fixPath(value: string): string {
return value.replace(''/'', path.sep);
}
}
}
Entonces, deberías poder importarlo:
// UtilOne.ts
import {My} from ''./UtilBase'';
namespace My.utils {
export class UtilOne extends My.utils.UtilBase {
}
}
Sin embargo, si el propósito es organizar el código, es una mala práctica usar espacios de nombres y módulos (ES6) al mismo tiempo. Con Node.js, sus archivos son módulos, entonces debe evitar los espacios de nombres.
Use módulos ES6 sin espacios de nombres
TypeScript admite la sintaxis de los módulos ES6 muy bien:
// 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 {
}
Es la forma recomendada. Los módulos ES6 evitan conflictos de nombres con la capacidad de cambiar el nombre de cada recurso importado.
Funcionará en Node.js (usando la sintaxis del módulo commonjs
en las opciones del compilador).
Para una buena introducción a la sintaxis de los módulos ES6, lea este artículo .
Use un archivo tsconfig.json
lugar de /// <reference
Aviso: La sintaxis /// <reference
se reemplaza por el archivo tsconfig.json
. Un ejemplo para Node.js:
// tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"target": "es6"
},
"exclude": [
"node_modules"
]
}