O código a seguir pode ser usado para criar um enum
no TypeScript:
enum e {
hello = 1,
world = 2
};
E os valores podem ser acessados por:
e.hello;
e.world;
Como crio um enum
com valores de string?
enum e {
hello = "hello", // error: cannot convert string to e
world = "world" // error
};
typescript
FacePalm
fonte
fonte
Respostas:
TypeScript 2.4
Agora tem enumerações de strings para que seu código funcione:
🌹
TypeScript 1.8
Desde o TypeScript 1.8, você pode usar tipos literais de strings para fornecer uma experiência confiável e segura para valores de strings nomeados (que é parcialmente para o que são usadas as enumerações).
Mais: https://www.typescriptlang.org/docs/handbook/advanced-types.html#string-literal-types
Suporte herdado
As enums no TypeScript são baseadas em números.
Você pode usar uma classe com membros estáticos:
Você também pode ficar claro:
Atualização: com base no requisito de poder fazer algo como
var test:E = E.hello;
o seguinte satisfaz isso:fonte
toString(): string { return this.value; }
toString
retorna uma string, pois ela retornathis.value
evalue
é do tipo string. Então você não pode fazervar x:number = E.hello.toString();
e se você fazvar x = E.hello.toString();
x é inferido para ser do tipostring
bem :)get()
métodoreturn this.value
? Dessa forma, ele retornará o valor da string sempre que acessado e não apenas durante a conversãotoString()
.value
membros em todos os tipos e os tratará como tipos comparáveis. Você pode tornar ovalue
membro privado. Dessa forma, o compilador não o verá e não tentará aplicar a tipagem estrutural.Na versão mais recente (1.0RC) do TypeScript, você pode usar enumerações como esta:
Atualização 1
Para obter o valor numérico do membro enum do valor da string, você pode usar este:
Atualização 2
No mais recente TypeScript 2.4, foram introduzidas enumerações de string, assim:
Para mais informações sobre o TypeScript 2.4, leia o blog no MSDN .
fonte
States[str]
não funciona hoje em dia.Type 'string' is not assignable to type 'States'
States[str as any]
para fazer na versão atual (2.x) do Typescript.TypeScript 2.4+
Agora você pode atribuir valores de sequência diretamente aos membros da enumeração:
Veja # 15486 para mais informações.
TypeScript 1.8+
No TypeScript 1.8+, você pode criar um tipo literal de sequência para definir o tipo e um objeto com o mesmo nome para a lista de valores. Ele imita o comportamento esperado de um enum de string.
Aqui está um exemplo:
O que funcionará como um enum de string:
Certifique-se de digitar todas as seqüências de caracteres no objeto! Caso contrário, no primeiro exemplo acima, a variável não seria implicitamente digitada
MyStringEnum
.fonte
No TypeScript 0.9.0.1, embora ocorra um erro no compilador, ele ainda pode compilar o arquivo ts no arquivo js. O código funciona como esperado e o Visual Studio 2012 pode oferecer suporte para o preenchimento automático de código.
Atualização:
Na sintaxe, o TypeScript não nos permite criar uma enumeração com valores de string, mas podemos hackear o compilador: p
Parque infantil
fonte
case Link.LEARN:
, receberá umCannot convert 'Link.LEARN' to 'string'
erro de compilação. A transmissão não funcionará.TypeScript 2.1 +
Os tipos de pesquisa , introduzidos no TypeScript 2.1, permitem outro padrão para simular enumerações de strings:
TypeScript 2.4 +
Com a versão 2.4, o TypeScript introduziu o suporte nativo para enumerações de strings; portanto, a solução acima não é necessária. Dos documentos do TS:
fonte
Colors["RED"]
não funcionará. Alguma idéia de como resolver isso (necessário para a conversão JSON).Por que não usar apenas a maneira nativa de acessar as strings de um enum.
fonte
enum Why { Because = "You Can't", Always = "Do Things That Way." }
;)Você pode usar enumerações de string no TypeScript mais recente:
Fonte: https://blog.rsuter.com/how-to-implement-an-enum-with-string-values-in-typescript/
ATUALIZAÇÃO - 2016
Uma maneira um pouco mais robusta de criar um conjunto de strings que eu uso para o React atualmente é assim:
fonte
<string>e.hello
dispara um erro.e.hello
ainda é considerado como um número pelo compilador.<number>e.hello
funciona embora. Existe alguma maneira de contornar isso? Tudo o que consigo pensar é<string><any>e.hello
.enum Test { a = <any>"b", b = <any>"c", c = <any>"a" }
Test.a === 'c'
<any>
então<string>
, basta fazer:someStringValue == someEnumValue.toString()
Aqui está uma solução bastante limpa que permite herança, usando o TypeScript 2.0. Eu não tentei isso em uma versão anterior.
Bônus: o valor pode ser de qualquer tipo!
fonte
Uma maneira hacky para isso é: -
CallStatus.ts
Utils.ts
Como usar
fonte
Isso funciona para mim:
ou
8)
Atualização: Logo após postar isso, descobri outra maneira, mas esqueci de postar uma atualização (no entanto, alguém já mencionou isso acima):
fonte
Acabei de declarar uma interface e usar uma variável desse tipo para acessar o enum. Manter a interface e a enum em sincronia é realmente fácil, pois o TypeScript reclama se algo muda na enum, assim.
A vantagem desse método é que não é necessária a conversão de tipos para usar a enum (interface) em várias situações, e, portanto, há suporte para mais tipos de situações, como o switch / case.
Usar a variável, em vez da enumeração, produz os resultados desejados.
Os sinalizadores eram outra necessidade para mim, então criei um módulo NPM que adiciona a este exemplo e inclui testes.
https://github.com/djabraham/ts-enum-tools
fonte
export default EAbFlagEnum as IAbFlagEnum;
vez de declarar novamente uma variável. Também removi o<any>
elenco no enum, funciona bem.ATUALIZAÇÃO: TypeScript 3.4
Você pode simplesmente usar
as const
:TypeScript 2.1
Isso também pode ser feito dessa maneira. Espero que ajude alguém.
fonte
Com os transformadores personalizados ( https://github.com/Microsoft/TypeScript/pull/13940 ), disponíveis em typescript @ next, você pode criar enum como objeto com valores de string de tipos literais de string.
Por favor, olhe para o meu pacote npm, ts-transformer-enumerate .
Exemplo de uso:
fonte
TypeScript <2.4
de https://basarat.gitbooks.io/typescript/docs/types/literal-types.html
Para o link de origem, você pode encontrar maneiras mais fáceis de realizar o tipo literal de string
fonte
Existem muitas respostas, mas não vejo soluções completas. O problema com a resposta aceita, além disso
enum { this, one }
, é que ela dispersa o valor da string que você está usando por meio de muitos arquivos. Também não gosto muito da "atualização", é complexa e não utiliza tipos também. Eu acho que a resposta de Michael Bromley é a mais correta, mas sua interface é um pouco complicada e poderia fazer com um tipo.Estou usando o TypeScript 2.0. * Aqui está o que eu faria
let greet: Greeting = Greeting.hello
Ele também possui informações muito mais agradáveis sobre o tipo / passar o mouse ao usar um IDE útil. A desvantagem é que você deve escrever as cordas duas vezes, mas pelo menos é apenas em dois lugares.
fonte
A resposta do @ basarat foi ótima. Aqui está simplificado, mas um exemplo um pouco mais extenso você pode usar:
fonte
Enfrentou esse problema recentemente com o TypeScript 1.0.1 e resolveu da seguinte maneira:
fonte
Eu acho que você deveria tentar com isso, neste caso o valor da variável não será alterado e funciona como enumerações. Usar como uma classe também funciona. A única desvantagem é que, por engano, você pode alterar o valor da variável estática e é isso que nós não queremos enums.
fonte
fonte
fonte
Pouco js-hacky, mas funciona:
e[String(e.hello)]
fonte
Se o que você deseja é principalmente depuração fácil (com verificação de tipo razoável) e não precisa especificar valores especiais para a enumeração, é isso que estou fazendo:
Se você deseja oferecer suporte ao armazenamento de dados / código herdado, mantenha as chaves numéricas.
Dessa forma, você pode evitar digitar os valores duas vezes.
fonte
Enum muito, muito, muito simples, com string (TypeScript 2.4)
fonte
Eu tentei no TypeScript 1.5 como abaixo e funcionou para mim
fonte
Eu estava procurando uma maneira de implementar descrições em enumerações datilografadas (v2.5) e esse padrão funcionou para mim:
...
fonte
TypeScript 0.9.0.1
Parque infantil TypeScript
fonte
Cannot convert 'string' to 'e'.
.