Configuro espacios de nombres globales para mis objetos estableciendo explícitamente una propiedad en window.
window.MyNamespace = window.MyNamespace || {};
TypeScript subraya MyNamespacey 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 MyNamespacecomo una variable ambiental y descartando la windowexplicitación, pero no quiero hacer eso.
declare var MyNamespace: any;
MyNamespace = MyNamespace || {};
¿Cómo puedo mantenerme windowallí y hacer feliz a TypeScript?
Como nota al margen, me parece especialmente divertido que TypeScript se queje, ya que me dice que windowes de tipo anyque 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
windowinterfaz existente para informarle sobre su nueva propiedad.fuente
.d.tsarchivo separado . No funciona cuando se usa en un.tsarchivo 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.tsarchivos 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
aslugar 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.MyNamespacefuente
window['MyNamespace']()(solo agregue paréntesis)Usando TSX? Ninguna de las otras respuestas me funcionó.
Esto es lo que hice:
fuente
(<any> window).MyNamespacerealidad<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
Windowinterfaz 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: MyWindowwindow.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.Windowpor 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
windowobjeto 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 globales 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
MyNamespacey la interfazMyNamespaceen 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
typingsquedó 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.tspor ejemplo,/src/@types/global.d.tsluego 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 globalparte 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.tsarchivo 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
.tsarchivo 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
windowobjeto, encontrarán que eso no es posible con eldeclare globalmé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
windowpara<any>que puedas hacerfuente
Usando create-react-app v3.3, encontré que la forma más fácil de lograr esto era extender el
Windowtipo 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
windowobjeto simplemente: -Y ahora el mecanografiado no se quejará.
fuente
windowse 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.tsextensió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.tsUna vez creado, no olvides exponerlo en tu
public_api.ts.Eso lo hizo por mí. Espero que esto ayude.
fuente