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 -
CommonJS
→var ... = require(''...'');
-
AMD
→define(...);
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:
- jQuery y su variable global
$
, - reflect-metadata para ampliar
Reflect
.
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