Eu queria passar para o TypeScript a partir do JS tradicional porque gosto da sintaxe semelhante ao c #. Meu problema é que não consigo descobrir como declarar classes estáticas no TypeScript.
Em C #, geralmente uso classes estáticas para organizar variáveis e métodos, reunindo-os em uma classe nomeada, sem a necessidade de instanciar um objeto. No vanilla JS, eu costumava fazer isso com um objeto JS simples:
var myStaticClass = {
property: 10,
method: function(){}
}
No TypeScript, prefiro minha abordagem C-sharpy, mas parece que as classes estáticas não existem no TS. Qual é a solução apropriada para esse problema?
fonte
.js
no seuhtml
. Assim, paraAngular 2
que você provavelmente está usandoSystem
... so'd fazerSystem.import("Folder/M");
(ou qualquer que seja o caminho é para o compilado.js
arquivo) antes dabootstrap import
As classes abstratas são cidadãos de primeira classe do TypeScript desde o TypeScript 1.6. Você não pode instanciar uma classe abstrata.
Aqui está um exemplo:
fonte
Singleton
é para o padrão de memória compartilhada da mesma instância de classe. Além disso, uma classe estática não possui instância por definição, portanto, você deve lançar uma exceção se o cliente tentar inicializá-la.abstract
palavra-chave é suportada no TypeScript.abstract
! @KimchiMan - ótima idéia!A definição de propriedades e métodos estáticos de uma classe é descrita em 8.2.1 da Especificação de linguagem do tipo de texto :
onde
Point.distance()
é um método estático (ou "classe").fonte
Essa pergunta é bastante antiga, mas eu queria deixar uma resposta que aproveite a versão atual do idioma. Infelizmente, as classes estáticas ainda não existem no TypeScript. No entanto, você pode escrever uma classe que se comporte de maneira semelhante, com apenas uma pequena sobrecarga, usando um construtor privado que impede a instanciação de classes de fora.
Esse trecho permitirá que você use classes "estáticas" semelhantes à contraparte do C #, com a única desvantagem de que ainda é possível instanciar as mesmas a partir de dentro. Felizmente, embora você não possa estender classes com construtores particulares.
fonte
Esta é uma maneira:
__static_ctor
aqui está uma expressão de função imediatamente chamada. O texto datilografado produzirá um código para chamá-lo no final da classe gerada.Atualização: para tipos genéricos em construtores estáticos, que não podem mais ser referenciados por membros estáticos, você precisará de uma etapa extra agora:
De qualquer forma, é claro, você poderia chamar o construtor estático do tipo genérico após a classe, como:
Basta lembrar de uso NUNCA
this
no__static_ctor
acima (obviamente).fonte
class SomeClass {}
gera um construtor - dificilmente vale a pena comentar como se fosse introduzido um novo problema. ;) FYI: Não existem "construtores" reais em JS - apenas funções que possuem um "this" quando chamados em objetos, ou vianew
. Isso existe, não importa o que seja para qualquer "classe".Recebi o mesmo caso de uso hoje (31/07/2018) e achei que isso era uma solução alternativa. É baseado em minha pesquisa e funcionou para mim. Expectativa - Para obter o seguinte no TypeScript:
Eu fiz isso:
Portanto, consumiremos como abaixo:
Isso funcionou para mim. Se alguém tiver outras sugestões melhores, deixe-nos ouvir! Obrigado...
fonte
Classes estáticas em linguagens como C # existem porque não há outras construções de nível superior para agrupar dados e funções. No JavaScript, no entanto, eles fazem e, portanto, é muito mais natural declarar um objeto como você. Para imitar mais de perto a sintaxe da classe, você pode declarar métodos como este:
fonte
Consulte http://www.basarat.com/2013/04/typescript-static-constructors-for.html
Essa é uma maneira de "falsificar" um construtor estático. Não é sem seus perigos - veja o item codeplex mencionado .
fonte
Uma maneira possível de conseguir isso é ter instâncias estáticas de uma classe dentro de outra classe. Por exemplo:
Em seguida, os parâmetros podem ser acessados usando o Wrapper, sem ter que declarar uma instância dele. Por exemplo:
Portanto, você obtém os benefícios do objeto de tipo JavaScript (conforme descrito na pergunta original), mas com os benefícios de poder adicionar a digitação TypeScript. Além disso, evita a necessidade de adicionar 'estático' na frente de todos os parâmetros da classe.
fonte
Com os módulos externos ES6, isso pode ser alcançado da seguinte maneira:
Isso evita o uso de módulos internos e namespaces, considerados maus práticas pelo TSLint [1] [2] , permite escopo privado e público e evita a inicialização de objetos de classe indesejados.
fonte
Eu estava procurando por algo semelhante e me deparei com algo chamado
Singleton Pattern
.Referência: Singleton Pattern
fonte
Você também pode usar palavras
namespace
- chave para organizar suas variáveis, classes, métodos e assim por diante. Veja docfonte