Eu configuro namespaces globais para meus objetos definindo explicitamente uma propriedade window
.
window.MyNamespace = window.MyNamespace || {};
O TypeScript sublinha MyNamespace
e reclama que:
A propriedade 'MyNamespace' não existe no valor do tipo 'window' any "
Posso fazer o código funcionar declarando MyNamespace
como uma variável de ambiente e eliminando a window
explicitação, mas não quero fazer isso.
declare var MyNamespace: any;
MyNamespace = MyNamespace || {};
Como posso ficar window
lá e fazer o TypeScript feliz?
Como observação lateral, acho especialmente engraçado que o TypeScript se queixe, pois me diz que window
é do tipo any
que definitivamente pode conter qualquer coisa.
typescript
joshuapoehls
fonte
fonte
Respostas:
Acabei de encontrar a resposta para isso na resposta de outra pergunta do StackOverflow .
Basicamente, você precisa estender a
window
interface existente para informar sobre sua nova propriedade.fonte
.d.ts
arquivo separado . Não funciona quando usado em um.ts
arquivo que usa as importações e as exportações. Veja esta resposta .declare global { interface Window { ... } }
trabalhos com texto datilografado 2.5.2, não há necessidade de.d.ts
arquivo como mencionado acimaerror TS1234: An ambient module declaration is only allowed at the top level in a file.
quando eu o colocava na parte superior do arquivo, ele corrigia esse erro; portanto, talvez você precise fazer isso também.Para mantê-lo dinâmico, basta usar:
fonte
as
em vez de<>
. Veja a resposta de @ david-boyd abaixo .this
-return (<any> this)['something in scope']
/* tslint:disable */
A PARTIR DO TIPESCRIÇÃO ^ 3.4.3 ESTA SOLUÇÃO NÃO FUNCIONA MAIS
Ou...
você pode apenas digitar:
e você não receberá um erro de compilação e funciona da mesma maneira que digitar
window.MyNamespace
fonte
window['MyNamespace']()
(basta adicionar colchetes)Usando TSX? Nenhuma das outras respostas estava funcionando para mim.
Aqui está o que eu fiz:
fonte
(<any> window).MyNamespace
, na verdade,<any>
é interpretado como JSX, não um tipo de conversão.A resposta aceita é o que eu costumava usar, mas com o TypeScript 0.9. * Ele não funciona mais. A nova definição da
Window
interface parece substituir completamente a definição interna, em vez de aumentá-la.Eu comecei a fazer isso:
ATUALIZAÇÃO: Com o TypeScript 0.9.5, a resposta aceita está funcionando novamente.
fonte
export default class MyClass{ foo(){ ... } ... }
interface MyWindow extends Window{ mc: MyClass }
declare var window: MyWindow
window.mc = new MyClass()
você pode chamar foo (), por exemplo, no console do Chrome Dev Tools, comomc.foo()
declare var...
todos os arquivos necessários.Window
pelo simples fato de que não é uma janela de baunilha. Apenas contornar a verificação de tipos ou tentar enganar o TS também não é o caminho para fazê-lo.Global são "maus" :), acho que a melhor maneira de ter também a portabilidade é:
Primeiro você exporta a interface: (por exemplo: ./custom.window.ts)
Segundo você importa
Terceira janela de var global convertida com CustomWindow
Dessa forma, você também não tem linha vermelha no IDE diferente se usar com atributos existentes do objeto window, portanto, no final, tente:
Testado com o Typecript 2.4.xe mais recente!
fonte
Se você precisar estender o
window
objeto com um tipo personalizado que exija o uso,import
use o seguinte método:window.d.ts
Consulte 'Ampliação global' na seção 'Mesclagem de declaração' do Manual: https://www.typescriptlang.org/docs/handbook/declaration-merging.html#global-augmentation
fonte
Para aqueles que usam a CLI Angular , é simples:
src / polyfills.ts
my-custom-utils.ts
Se você estiver usando o IntelliJ, também precisará alterar a seguinte configuração no IDE antes de seus novos polyfills:
fonte
declare global
é o truque, e esta resposta não é realmente específica para o Angular CLI ...Não preciso fazer isso com muita frequência, o único caso que tive foi ao usar o Redux Devtools com middleware.
Eu simplesmente fiz:
Ou você pode fazer:
let myWindow = window as any;
e depois
myWindow.myProp = 'my value';
fonte
A maioria das outras respostas não é perfeita.
Eu também encontro o mesmo problema esta manhã. Eu tentei tantas "soluções" no SO, mas nenhuma delas produz nenhum erro de tipo absolutamente e habilita o disparo de tipo de salto no IDE (webstorm ou vscode).
Finalmente, daqui
, Acho uma solução razoável para anexar digitações para a variável global que atua como interface / classe e espaço para nome .
O exemplo está abaixo:
Agora, o código acima mescla as tipagens do namespace
MyNamespace
e da interfaceMyNamespace
na variável globalmyNamespace
(a propriedade da janela).fonte
Depois de encontrar respostas, acho que esta página pode ser útil. https://www.typescriptlang.org/docs/handbook/declaration-merging.html#global-augmentation Não tenho certeza sobre o histórico de mesclagem de declarações, mas explica por que o seguinte poderia funcionar.
fonte
Veja como fazer isso, se você estiver usando o TypeScript Definition Manager !
Criar
typings/custom/window.d.ts
:Instale sua digitação personalizada:
Feito, use ! Texto datilografado não vai mais reclamar:
fonte
typings
ficou obsoleto com o Typescript 2.0 (meados de 2016) e foi arquivado pelo proprietário.O Typscript não executa verificação de tipo nas propriedades da string.
Idealmente, o cenário variável global deve ser evitado. Às vezes, uso-o para depurar um objeto no console do navegador.
fonte
Crie um arquivo chamado,
global.d.ts
por exemplo/src/@types/global.d.ts
, defina uma interface como:ref: https://www.typescriptlang.org/docs/handbook/declaration-files/templates/global-d-ts.html
fonte
Se você estiver usando o Typecript 3.x, poderá omitir a
declare global
parte das outras respostas e, em vez disso, basta usar:Isso funcionou comigo ao usar o Typecript 3.3, WebPack e TSLint.
fonte
^3.4.3
. Esta resposta funcionou para mim stackoverflow.com/a/42841166/1114926Para referência (esta é a resposta correta):
Dentro de um
.d.ts
arquivo de definiçãoSe você trabalha no navegador, adiciona membros ao contexto da janela do navegador reabrindo a interface do Windows:
Mesma idéia para o NodeJS:
Agora você declara a variável raiz (que realmente ficará na janela ou global)
Em seguida, em um
.ts
arquivo regular , mas importado como efeito colateral, você realmente o implementa:E, finalmente, use-o em outro lugar na base de código, com:
fonte
Faça uma interface personalizada estender a Janela e adicione sua propriedade personalizada como opcional.
Em seguida, deixe o CustomWindow que usa a interface personalizada, mas avaliado com a janela original.
Trabalhou com o [email protected].
fonte
Para aqueles que desejam definir uma propriedade computada ou dinâmica no
window
objeto, você verá que isso não é possível com odeclare global
método. Para esclarecer esse caso de usoVocê pode tentar fazer algo assim
O erro acima irá embora. Isso ocorre porque no Typescript, as interfaces não funcionam bem com as propriedades computadas e geram um erro como
Para contornar isso, você pode sugerir a transmissão
window
para<any>
que você possa fazerfonte
Usando create-react-app v3.3, encontrei a maneira mais fácil de conseguir isso: estender o
Window
tipo no arquivo gerado automaticamentereact-app-env.d.ts
:fonte
Primeiro, você precisa declarar o objeto da janela no escopo atual.
Porque o texto datilografado gostaria de saber o tipo do objeto.
Como o objeto window está definido em outro lugar, você não pode redefini-lo.
Mas você pode declarar da seguinte forma: -
Isso não redefinirá o objeto da janela ou não criará outra variável com o nome
window
.Isso significa que a janela está definida em outro lugar e você está apenas referenciando-a no escopo atual.
Em seguida, você pode se referir ao seu objeto MyNamespace simplesmente:
Ou você pode definir a nova propriedade no
window
objeto simplesmente por: -E agora o texto datilografado não vai reclamar.
fonte
window
está definido?Eu queria usar isso em uma biblioteca Angular (6) hoje e demorei um pouco para que isso funcionasse conforme o esperado.
Para que minha biblioteca use declarações, tive que usar a
d.ts
extensão do arquivo que declara as novas propriedades do objeto global.Então, no final, o arquivo acabou com algo como:
/path-to-angular-workspace/angular-workspace/projects/angular-library/src/globals.d.ts
Uma vez criado, não esqueça de expô-lo no seu
public_api.ts
.Isso fez por mim. Espero que isto ajude.
fonte