Eu defini a seguinte enumeração no TypeScript:
enum Color{
Red, Green
}
Agora, na minha função, recebo cores como uma sequência. Eu tentei o seguinte código:
var green= "Green";
var color : Color = <Color>green; // Error: can't convert string to enum
Como posso converter esse valor em uma enumeração?
typescript
Amitabh
fonte
fonte
--noImplicitAny
(no VS desmarcado "Permitir tipos implícitos 'qualquer'"). Produzerror TS7017: Index signature of object type implicitly has an 'any' type.
para mim isso funcionou:var color: Color = (<any>Color)[green];
(testado com a versão 1.4)var color : Color = Color[green as keyof typeof Color];
A partir do Typecript 2.1, as chaves de seqüência de caracteres nas enumerações são fortemente digitadas.
keyof typeof
é usado para obter informações sobre as chaves de string disponíveis ( 1 ):https://www.typescriptlang.org/docs/handbook/advanced-types.html#index-types
fonte
let s = "Green"; let typedColor = <keyof typeof Color> s;
let
porconst
funcionará sem vazamento. Exemplo atualizado para esclarecer isso. Obrigado @SergeyTtypedColorString = Color["Black"];
agora retornaerror TS7015: Element implicitly has an 'any' type because index expression is not of type 'number'
const color: Color = Color[colorString as keyof typeof Color];
Se você tem certeza de que uma sequência de entrada tem uma correspondência exata com a cor enum, use:
No caso em que uma sequência de entrada pode não corresponder ao Enum, use:
Parque infantil
Se não convertermos
enum
para<any>
digitar, o TypeScript mostrará o erro:Isso significa que, por padrão, o tipo TypeScript Enum funciona com índices numéricos, ou seja
let c = Color[0]
, mas não com índices de string comolet c = Color["string"]
. Essa é uma restrição conhecida pela equipe da Microsoft para os índices de sequência de objetos de problemas mais gerais .fonte
typeof '0'
deveria serstring
Este exemplo funciona com
--noImplicitAny
no TypeScriptFontes:
https://github.com/Microsoft/TypeScript/issues/13775#issuecomment-276381229 https://www.typescriptlang.org/docs/handbook/advanced-types.html#index-types
fonte
Esta nota se refere à resposta do basarat , não à pergunta original.
Eu tive um problema estranho em meu próprio projeto, em que o compilador estava dando um erro aproximadamente equivalente a "não é possível converter a seqüência de caracteres em cores" usando o equivalente deste código:
Descobri que a inferência do tipo de compilador estava ficando confusa e achava que
colorId
era um valor enum e não um ID. Para corrigir o problema, tive que converter o ID como uma string:Não sei ao certo o que causou o problema, mas deixarei esta nota aqui, caso alguém tenha o mesmo problema que eu.
fonte
Eu consegui trabalhar usando o seguinte código.
fonte
Se você fornecer valores de sequência para sua enumeração, uma conversão direta funcionará perfeitamente.
fonte
const colorEnum = "Blue" as Color
não irá errar, e você ficaria pensando quecolorEnum
está tudo bem. Mas se vocêconsole.log
fizesse isso, veria "Blue". A resposta de Artru é boa, porquecolorEnum
seráundefined
- e você pode verificar isso especificamente.Como você usa o texto datilografado: Muitas das soluções acima podem não funcionar ou são muito complexas.
Situação : as strings não são iguais aos valores da enumeração (a caixa difere)
Apenas use:
fonte
Também encontrei o mesmo erro do compilador. Apenas uma ligeira variação mais curta da abordagem de Sly_cardinal.
fonte
myProp.color = Color[<string><any>myProp.color]
CheersSe o compilador TypeScript souber que o tipo de variável é string, isso funcionará:
Caso contrário, você deve convertê-lo explicitamente em uma string (para evitar avisos do compilador):
Em tempo de execução, ambas as soluções funcionarão.
fonte
<string>colorName
vez de"" + colorName
?Há muitas informações mistas nesta questão, então vamos abordar toda a implementação do TypeScript 2.x + no Guia do Nick para usar enums em modelos com TypeScript .
Este guia é para: pessoas que estão criando código do lado do cliente que está ingerindo um conjunto de seqüências conhecidas do servidor que seriam convenientemente modeladas como um Enum no lado do cliente.
Definir a enumeração
Vamos começar com o enum. Deve ser algo como isto:
Duas coisas de nota aqui:
Estamos declarando-os explicitamente como casos de enumeração com suporte a strings, o que nos permite instancia-los com strings, e não outros números não relacionados.
Nós adicionamos uma opção que pode ou não existir em nosso modelo de servidor:
UNKNOWN
. Isso pode ser tratado comoundefined
se você preferir, mas eu gosto de evitar| undefined
tipos sempre que possível para simplificar o manuseio.A grande vantagem de ter um
UNKNOWN
caso é que você pode ser realmente óbvio no código e criar estilos para casos de enum desconhecidos brilhantes em vermelho e intermitente, para que você saiba que não está lidando com algo corretamente.Analisar a enumeração
Você pode estar usando esse enum incorporado em outro modelo, ou sozinho, mas precisará analisar o enum do tipo JSON ou XML (ha) da string em seu equivalente fortemente tipado. Quando incorporado em outro modelo, esse analisador vive no construtor de classe.
Se o enum for analisado corretamente, ele terminará como o tipo apropriado. Caso contrário, será
undefined
e você poderá interceptá-lo e devolver seuUNKNOWN
caso. Se você preferir usarundefined
como caso desconhecido, basta retornar qualquer resultado da tentativa de análise de enum.A partir daí, é apenas uma questão de usar a função de análise e usar sua variável de tipo recém-forte.
fonte
IssueType["REPS"]="REPS"
. Se você tivesse definido seu enum um pouco diferente, digamos,REPS="reps"
isso renderia oIssueType["REPS"]="reps"
que ...IssueType.UNKNOWN
porque não há chavereps
na sua enumeração. Pena que ainda não encontrei solução para isso, pois minhas cordas contêm hífens, o que as torna inutilizáveis como chaves.Eu estava procurando por uma resposta que pudesse obter um
enum
de astring
, mas no meu caso, os valores de enumerações tinham valores de sequência diferentes. O OP tinha um enum simples paraColor
, mas eu tinha algo diferente:Quando você tenta resolver
Gender.CantTell
com uma"Can't tell"
sequência, ela retornaundefined
com a resposta original.Outra resposta
Basicamente, eu vim com outra resposta, fortemente inspirada por esta resposta :
Notas
filter
, supondo que o cliente esteja passando uma string válida do enum. Se não for o caso,undefined
será devolvido.enumObj
paraany
, porque com texto dactilografado 3.0+ (actualmente a utilizar texto dactilografado 3,5), aenumObj
é resolvido comounknown
.Exemplo de Uso
Nota: E, como alguém apontou em um comentário, eu também queria usar o
noImplicitAny
.Versão atualizada
Sem elenco
any
e tipografia adequada.Além disso, a versão atualizada possui uma maneira mais fácil de chamá-la e é mais legível:
fonte
Eu precisava saber como fazer um loop sobre valores de enumeração (estava testando muitas permutações de várias enumerações) e achei que funcionava bem:
Fonte: https://blog.mikeski.net/development/javascript/typescript-enums-to-from-string/
fonte
each
testar todos os casos enum único com apenas um métodoEnum
Uso da amostra
Ignorar análise sensível a maiúsculas e minúsculas
fonte
return enumType[property];
em um caso quando seus enum O artigo olha comoSkills = "anyvalue"
As enums criadas da maneira que você fez são compiladas em um objeto que armazena os mapeamentos para frente
(name -> value)
e para trás(value -> name)
. Como podemos observar nesta captura de tela do chrome devtools:Aqui está um exemplo de como o mapeamento duplo funciona e como converter de um para outro:
fonte
Tente isto
Isso funciona bem para a versão 3.5.3
fonte
Se você estiver usando espaços para nome para estender a funcionalidade do seu enum, também poderá fazer algo como
e use assim
fonte
outra variação pode ser
fonte