type namespaced namespace cannot typescript

cannot - typescript namespaced class



TypeScript var vs import (3)

La palabra clave de import TypeScript tiene varios usos, algunos dependiendo del entorno, y explica por qué es confuso. Veamos que con el nivel de detalle mínimo (porque en un proyecto real puede ser aún más complejo):

Módulos CommonJs / Nodo

@mfc: Este es el caso que corresponde a su pregunta.

El proyecto de TypeScript está utilizando módulos CommonJs, normalmente un proyecto de nodo:

// tsconfig.json { "compilerOptions": { "module": "commonjs", ... } }

En este contexto, import _ = require(''http''); ( versión # 1 ) se transpila a var _ = require(''http''); ( versión # 2 ). Así que la versión # 1 es la sintaxis de TypeScript mientras que la versión # 2 es la sintaxis de JavaScript.

require() es compatible con la versión 1 pero no con la versión # 2 (error [ts] Cannot find name ''require''. ) a menos que se agreguen tipificaciones de nodos al proyecto a través de npm i @types/node --save-dev (vea este stackoverflow Q / A ) .

Módulos es6

@mfc: Este no es el caso que pediste. Pero está en la respuesta de Trott, así que lo he tenido en cuenta.

import es la palabra clave ES6 y tiene su propia sintaxis :

  • Importación "completa" de exportaciones con nombre: import * as lib from ''lib'';
  • Importación "Picking" de exportaciones con nombre: import { square, diag } from ''lib'';
  • Importación de la exportación predeterminada: import myFunc from ''myFunc'';

Estas importaciones se procesan de manera diferente según la opción de compilador del módulo mencionada anteriormente:

  • ES6 → sin cambios
  • CommonJSvar ... = require(''...'');
  • AMDdefine(...);

Espacios de nombres

Alias

@mfc: Este no es el caso que pediste. Pero está en la respuesta de José A, así que lo he agregado aquí para tener la imagen completa.

En un namespace , anteriormente llamado "módulo (interno)", la import se utiliza para crear un https://www.typescriptlang.org/docs/handbook/namespaces.html#aliases , un acceso directo a un elemento exportado de otro espacio de nombres.

namespace Root.Branch.Leaf { export const configPath = ''...''; } namespace LeafClient { import configPath = Root.Branch.Leaf.configPath; console.log(`configPath=${configPath}`); }

La línea import configPath = Root.Branch.Leaf.configPath; se transpila en var configPath = Root.Branch.Leaf.configPath; , cf. TypeScript PlayGround .

¡Cuidado con los usos fuera de un espacio de nombres, ya que creó variables globales!

Módulo global

Algunas bibliotecas modifican el objeto global (la variable global de window en un navegador) , por ejemplo:

La sintaxis de ES6 también permite cargar este tipo de biblioteca utilizando solo efectos secundarios import : import "reflect-metadata";

TypeScript soporta este tipo de importaciones . El compilador intentará obtener la definición de escritura correspondiente para comprender los efectos de la biblioteca, por ejemplo, el nuevo método Reflect.getMetadata() .

En TypeScript, ¿cuál es la diferencia entre

import http = require(''http'');

y

var http = require(''http'');

Veo que se utilizan ambas formas en el código fuente, ¿son intercambiables?


Su declaración de import es TypeScript y no se ejecutará como está en Nodo. Primero deberá compilarlo (¿transpilarlo?) A JavaScript. Puede leer los documentos de TypeScript para obtener más información sobre cómo funciona la palabra clave de import TypeScript. Vea la sección "Salir de afuera" de su Módulo doc .

También hay una palabra clave de import en JavaScript, pero no funciona de la forma en que funciona la import de TypeScript. Solo funcionará en versiones de Nodo que admitan módulos ES6. Existen diferencias entre esta import y require que pueda leer sobre "Módulos ES6: La sintaxis final" . Esa import es algo que puede comparar / contrastar con require pero no realmente var .


Tuve la misma pregunta. Acabo de encontrar esto en la sección "Alias" de Typescript:

Esto es similar a usar var, pero también funciona en los significados de tipo y espacio de nombres del símbolo importado. Es importante destacar que, para los valores, la importación es una referencia distinta del símbolo original, por lo que los cambios en una variable con alias no se reflejarán en la variable original

https://www.typescriptlang.org/docs/handbook/namespaces.html#aliases