2
respostas

Ainda tenho problemas com Enum

Boa tarde!

Marquei o tópico anterior como resolvido cedo demais.

Vamos lá, nele o colega Estudante me sugeriu o seguinte código:

enum PersonNature {  
    FISICA = 'F',  
    JURIDICA = 'J'  
}  

class Person {  
    name: string  
    personNature: PersonNature  
    
    constructor(name: string, personNature: string) {
        this.name = name;
        this.personNature = PersonNature.from(personNature);
    }

    getPersonNatureName(): string {
        return PersonNature[this.personNature];
    }
}

namespace PersonNature {
    export function from(value: string): PersonNature {
        switch (value) {
            case 'F':
                return PersonNature.FISICA;
            case 'J':
                return PersonNature.JURIDICA;
            default:
                throw new Error('Tipo de pessoa inválido');
        }
    }
}

const pessoa = new Person('João', 'F');
console.log(pessoa.getPersonNatureName()); // Isso vai retornar 'FISICA'

Infelizmente ele não funcionou para mim. Fica apresentando o erro abaixo na linha return PersonNature[this.personNature];:

Element implicitly has an 'any' type because expression of type 'PersonNature' can't be used to index type 'typeof PersonNature'.
  Property '[PersonNature.FISICA]' does not exist on type 'typeof PersonNature'.

Alguém poderia me ajudar?

2 respostas

Certamente, o problema está relacionado ao fato de que PersonNature é uma enumeração e não pode ser usada diretamente como um índice. No entanto, você pode corrigir isso fazendo uma pequena alteração no método getPersonNatureName da classe Person.

Aqui está uma versão modificada do seu código que deve resolver o problema:

enum PersonNature {  
    FISICA = 'F',  
    JURIDICA = 'J'  
}  

class Person {  
    name: string  
    personNature: PersonNature  
    
    constructor(name: string, personNature: string) {
        this.name = name;
        this.personNature = PersonNature.from(personNature);
    }

    getPersonNatureName(): string {
        // Converta a enumeração para string diretamente
        return this.personNature.toString();
    }
}

namespace PersonNature {
    export function from(value: string): PersonNature {
        switch (value) {
            case 'F':
                return PersonNature.FISICA;
            case 'J':
                return PersonNature.JURIDICA;
            default:
                throw new Error('Tipo de pessoa inválido');
        }
    }
}

const pessoa = new Person('João', 'F');
console.log(pessoa.getPersonNatureName()); // Isso vai retornar 'FISICA'

Nesta versão, getPersonNatureName simplesmente usa toString() na enumeração personNature, que é uma forma segura e eficaz de obter o nome da enumeração como uma string.

Bom dia. Obrigado pela tentativa Carlos, contudo, o toString() retorna o valor, F ou J, e não o nome da enum (FISICA ou JURIDICA), que é o que preciso. Acredito vou ter que acabar usando uma classe mesmo e não uma enum.