Configuro espacios de nombres globales para mis objetos estableciendo explícitamente una propiedad en window
.
window.MyNamespace = window.MyNamespace || {};
TypeScript subraya MyNamespace
y se queja de que:
La propiedad 'MyNamespace' no existe en el valor de tipo 'window' any "
Puedo hacer que el código funcione declarándolo MyNamespace
como una variable ambiental y descartando la window
explicitación, pero no quiero hacer eso.
declare var MyNamespace: any;
MyNamespace = MyNamespace || {};
¿Cómo puedo mantenerme window
allí y hacer feliz a TypeScript?
Como nota al margen, me parece especialmente divertido que TypeScript se queje, ya que me dice que window
es de tipo any
que definitivamente puede contener cualquier cosa.
typescript
joshuapoehls
fuente
fuente
Respuestas:
Acabo de encontrar la respuesta a esto en la respuesta de otra pregunta de StackOverflow .
Básicamente, necesita extender la
window
interfaz existente para informarle sobre su nueva propiedad.fuente
.d.ts
archivo separado . No funciona cuando se usa en un.ts
archivo que usa importaciones y se exporta a sí mismo. Mira esta respuesta .declare global { interface Window { ... } }
obras con texto mecanografiado 2.5.2, sin necesidad de.d.ts
archivos como se mencionó anteriormenteerror TS1234: An ambient module declaration is only allowed at the top level in a file.
cuando lo puse en la parte superior del archivo, solucionó ese error, por lo que es posible que tenga que hacerlo también.Para mantenerlo dinámico, solo use:
fuente
as
lugar de hacerlo<>
. Vea la respuesta de @ david-boyd a continuación .this
-return (<any> this)['something in scope']
/* tslint:disable */
A PARTIR DE TYPESCRIPT ^ 3.4.3 ESTA SOLUCIÓN NO FUNCIONA
O...
solo puedes escribir:
y no obtendrá un error de compilación y funciona igual que escribir
window.MyNamespace
fuente
window['MyNamespace']()
(solo agregue paréntesis)Usando TSX? Ninguna de las otras respuestas me funcionó.
Esto es lo que hice:
fuente
(<any> window).MyNamespace
realidad<any>
se interpreta como JSX, no como un tipo de conversión.La respuesta aceptada es lo que solía usar, pero con TypeScript 0.9. * Ya no funciona. La nueva definición de la
Window
interfaz parece reemplazar por completo la definición incorporada, en lugar de aumentarla.En cambio, he decidido hacer esto:
ACTUALIZACIÓN: Con TypeScript 0.9.5 la respuesta aceptada está funcionando nuevamente.
fuente
export default class MyClass{ foo(){ ... } ... }
interface MyWindow extends Window{ mc: MyClass }
declare var window: MyWindow
window.mc = new MyClass()
Entonces puede llamar a foo (), por ejemplo, desde la consola de Chrome Dev Tools comomc.foo()
declare var...
a todos los archivos que necesita.Window
por el simple hecho de que no es una ventana de vainilla. Eludir la verificación de tipos o tratar de engañar a TS tampoco es la forma de hacerlo.Global son "malvados" :), creo que la mejor manera de tener también la portabilidad es:
Primero exporta la interfaz: (por ejemplo: ./custom.window.ts)
En segundo lugar importas
Tercera ventana de conversión global de conversión con CustomWindow
De esta manera, no tiene también una línea roja en IDE diferente si lo usa con atributos existentes de objetos de ventana, así que al final intente:
Probado con Typecript 2.4.xy más nuevo!
fuente
Si necesita extender el
window
objeto con un tipo personalizado que requiera su usoimport
, puede usar el siguiente método:window.d.ts
Consulte 'Aumento global' en la sección 'Fusión de declaraciones' del Manual: https://www.typescriptlang.org/docs/handbook/declaration-merging.html#global-augmentation
fuente
Para aquellos que usan la CLI Angular es sencillo:
src / polyfills.ts
my-custom-utils.ts
Si está utilizando IntelliJ, también debe cambiar la siguiente configuración en el IDE antes de que se recuperen sus nuevos polyfills:
fuente
declare global
es el truco, y esta respuesta no es realmente específica para Angular CLI ...No necesito hacer esto muy a menudo, el único caso que tuve fue cuando utilicé Redux Devtools con middleware.
Simplemente hice:
O podrías hacer:
let myWindow = window as any;
y entonces
myWindow.myProp = 'my value';
fuente
La mayoría de las otras respuestas no son perfectas.
También encuentro el problema similar esta mañana. Probé tantas "soluciones" en SO, pero ninguna de ellas produce absolutamente ningún error de tipo y permite activar el salto de tipo en IDE (tormenta web o vscode).
Finalmente desde aquí
, Encuentro una solución razonable para adjuntar tipings para la variable global que actúa como interfaz / clase y espacio de nombres .
El ejemplo está abajo:
Ahora, el código anterior combina las tipificaciones del espacio de nombres
MyNamespace
y la interfazMyNamespace
en la variable globalmyNamespace
(la propiedad de la ventana).fuente
Después de encontrar respuestas, creo que esta página podría ser útil. https://www.typescriptlang.org/docs/handbook/declaration-merging.html#global-augmentation No estoy seguro sobre el historial de fusión de declaraciones, pero explica por qué lo siguiente podría funcionar.
fuente
¡Aquí le mostramos cómo hacerlo si usa el Administrador de definiciones de TypeScript !
Crear
typings/custom/window.d.ts
:Instala tu mecanografía personalizada:
Listo, úsalo ! La mecanografía ya no se quejará:
fuente
typings
quedó obsoleto con Typecript 2.0 (mediados de 2016) y ha sido archivado por el propietario.Typscript no realiza la verificación de tipo en las propiedades de cadena.
Idealmente, se debe evitar el escenario variable global. Lo uso a veces para depurar un objeto en la consola del navegador.
fuente
Cree un archivo llamado,
global.d.ts
por ejemplo,/src/@types/global.d.ts
luego defina una interfaz como:ref: https://www.typescriptlang.org/docs/handbook/declaration-files/templates/global-d-ts.html
fuente
Si está utilizando Typecript 3.x, es posible que pueda omitir la
declare global
parte en las otras respuestas y, en su lugar, simplemente use:Esto funcionó conmigo cuando usé Typecript 3.3, WebPack y TSLint.
fuente
^3.4.3
. Esta respuesta funcionó para mí stackoverflow.com/a/42841166/1114926Como referencia (esta es la respuesta correcta):
Dentro de un
.d.ts
archivo de definiciónSi trabaja en el navegador, agrega miembros al contexto de la ventana del navegador al volver a abrir la interfaz de Windows:
La misma idea para NodeJS:
Ahora declara la variable raíz (que realmente vivirá en la ventana o global)
Luego, en un
.ts
archivo normal , pero importado como efecto secundario, en realidad lo implementa:Y, finalmente, úselo en otra parte de la base de código, ya sea con:
fuente
Hacer una interfaz personalizada extiende la Ventana y agrega tu propiedad personalizada como opcional.
Luego, deje la ventana personalizada que usa la interfaz personalizada, pero que se valora con la ventana original.
Se trabajó con el [email protected].
fuente
Para aquellos que quieran establecer una propiedad calculada o dinámica en el
window
objeto, encontrarán que eso no es posible con eldeclare global
método. Para aclarar para este caso de usoPodrías intentar hacer algo como esto
Sin embargo, lo anterior será un error. Esto se debe a que, en Typecript, las interfaces no funcionan bien con las propiedades calculadas y arrojan un error como
Para evitar esto, puedes ir con la sugerencia de emitir
window
para<any>
que puedas hacerfuente
Usando create-react-app v3.3, encontré que la forma más fácil de lograr esto era extender el
Window
tipo en el autogeneradoreact-app-env.d.ts
:fuente
Primero debe declarar el objeto de ventana en el alcance actual.
Porque mecanografiado quisiera saber el tipo del objeto.
Como el objeto de ventana está definido en otro lugar, no puede redefinirlo.
Pero puede declararlo de la siguiente manera:
Esto no redefinirá el objeto de la ventana o no creará otra variable con nombre
window
.Esto significa que la ventana está definida en otro lugar y solo está haciendo referencia a ella en el alcance actual.
Entonces puede referirse a su objeto MyNamespace simplemente por: -
O puede establecer la nueva propiedad en el
window
objeto simplemente: -Y ahora el mecanografiado no se quejará.
fuente
window
se define?Quería usar esto en una biblioteca Angular (6) hoy y me tomó un tiempo lograr que funcionara como se esperaba.
Para que mi biblioteca use declaraciones, tuve que usar la
d.ts
extensión del archivo que declara las nuevas propiedades del objeto global.Entonces, al final, el archivo terminó con algo como:
/path-to-angular-workspace/angular-workspace/projects/angular-library/src/globals.d.ts
Una vez creado, no olvides exponerlo en tu
public_api.ts
.Eso lo hizo por mí. Espero que esto ayude.
fuente