¿Por qué necesitamos el declare
en la declaración?
export declare class Actions {
...
}
typescript
born2net
fuente
fuente
Respuestas:
encontré lo que estaba buscando:
Declarar contra var
var
crea una nueva variable.declare
se usa para decirle a TypeScript que la variable se ha creado en otro lugar. Si usadeclare
, no se agrega nada al JavaScript que se genera; es simplemente una pista para el compilador.Por ejemplo, si usa un script externo que define
var externalModule
, usaríadeclare var externalModule
para insinuar el compilador de TypeScript queexternalModule
ya se ha configuradofuente
externalModule
entre otras. ¿Cuál podría ser la razón por la cualexternalModule
no está definida en tiempo de ejecución pero algunas de las otras variables no?Para comprender esto, primero debe comprender la palabra clave "declarar".
Aquí hay una buena explicación del blog de Gil Fink :
Entonces, después de comprender la palabra clave "declarar", regrese a donde encuentre el
La implementación real de la clase probablemente se encuentre en otro lugar, tal vez un archivo .js.
fuente
declare var myLibrary
se trasladará a la nada: typescriptlang.org/play/#code/…declare
en mecanografiado:La
declare
palabra clave en mecanografiado es útil para decirle al compilador mecanografiado que una declaración está definida en otro lugar (en algún lugar escrito en un archivo javascript externo o parte del entorno de tiempo de ejecución).Digamos que tenemos una variable llamada foo declarada en otro lugar. Cuando intentamos hacer referencia a la variable, el compilador mecanografiado arrojará un error:
Podemos solucionar este problema usando la
declare
palabra clave:Esto tiene las siguientes consecuencias:
foo
realidad no se declara en ningún otro lugar, e intentamos usar la variable, puede ocurrir un error de tiempo de ejecución. Por lo tanto, solo use ladeclare
palabra clave cuando sepa que la variable está disponible en este momento.fuente
La palabra clave declarar en este caso específico:
... aparentemente es inútil y creo que TypeScript debería considerar hacer esto un error (no sé si hay una razón oculta). Si declara una clase, nunca necesitará importarla. Si exporta una clase esperando que alguien la importe, no necesita declararla. Y debido a que está declarando esta clase, por definición, esta clase debería ser utilizable sin la necesidad de importarla. Pero esto no es cierto cuando exporta declarar una clase. Usted necesita importarlo a utilizar.
TL; DR
es lo mismo que
fuente
import
, el segundo nodeclare
- sin palabras clave de importación o exportación - define archivos de declaración seleccionados automáticamente por TypeScript, que es una característica útil para agregar escritura a módulos heredados (paquetes instalados npm sin definiciones de TypeScript).import
/export
es la forma correcta de usar módulos, y todo necesita ser importado manualmente (y me parece un poco tedioso), ya sea lógica, o bien son definiciones.Como un caso de uso práctico, le
export declare
permite evitar exportar todos los subelementos, por ejemplo:Que puede ser más fácil de leer que:
La importación externa es la misma en ambos casos (p. Ej.
import { Redux } from 'definitions/redux';
. ), Lo que no sé si es una buena práctica o no, ¡pero lo encuentro ordenado! ^^Es importante tener en cuenta que la adición de una
import
oexport
de su archivo promoverá que sea un módulo, por lo que eldeclare
alcance no será a nivel mundial más.PS, hay un error ( problema 16671 ): si usa
const enum
en su declaración (lo hago para el tipo de acciones redux) y especificó eltranspileOnly
indicador (el paquete create-react-app-typescript lo hace, por eso lo sé), el ¡enumeración no estará en línea! Puede correr en él, puede que no, ¡pero es útil saberlo de antemano!fuente
export namespace
son una buena idea y agregan espacios de nombres innecesarios . Al respectoexport declare
, eche un vistazo a la respuesta de André Pena.