Skip to content

Instantly share code, notes, and snippets.

@EricsonWillians
Last active September 28, 2023 17:38
Show Gist options
  • Save EricsonWillians/e1876ddc9dc85eadec4bf31cb1606823 to your computer and use it in GitHub Desktop.
Save EricsonWillians/e1876ddc9dc85eadec4bf31cb1606823 to your computer and use it in GitHub Desktop.
Fancy Stherzada Generics
// Definindo uma habilidade de codificação (ou "mixin")
type Coder = {
codeIn(language: string); // Método para codificar em uma linguagem específica
};
// Função que adiciona a habilidade de codificação a uma classe
function CodingMixin<TBase>(base: new (...args: any[]) => TBase): new <TSkills>(...args: any[]) => TBase & Coder {
// Retorna uma nova classe que estende a classe base e implementa a habilidade de codificação
return class extends (base as any) implements Coder {
// Método que permite codificar em uma linguagem específica e exibir o nível de habilidade
codeIn(language: string): this {
const proficiency = (this as any).skills[language] || "desconhecido"; // Obtém o nível de habilidade ou usa "desconhecido" se não for encontrado
console.log(`Especialidade em ${language}: ${proficiency}`);
console.log(`${this.name} programa em ${language}.`);
return this; // Retorna a instância atual para possibilitar encadeamento de métodos
}
} as any;
}
// Classe representando uma pessoa versátil com habilidades específicas
class VersatilePerson<T> {
constructor(public name: string, public age: number, public skills: T) {}
// Exibe as habilidades de codificação da pessoa
displaySkills() {
console.log(`Minhas habilidades de programação incluem: ${JSON.stringify(this.skills)}`);
return this; // para encadeamento de métodos
}
// Introduz a pessoa
introduce() {
console.log(`Eu tenho ${this.age} anos.`);
return this; // para encadeamento de métodos
}
// Método que pode ser sobrescrito pelo mixin para exibir a habilidade de codificação
codeIn(language: string) {
console.log(`${this.name} talvez programe em ${language}.`);
return this; // para encadeamento de métodos
}
}
// Criando uma nova classe que é uma combinação de VersatilePerson e a habilidade de codificação
const EnhancedCoder = CodingMixin(VersatilePerson);
// Instanciando a nova classe com habilidades específicas
const stherzada = new EnhancedCoder<{ [key: string]: string }>('Stherzada', 25, {
TypeScript: 'Especialista',
JavaScript: 'Intermediário',
Python: 'Iniciante'
});
// Chamando os métodos em sequência
stherzada.displaySkills().introduce().codeIn('TypeScript').codeIn('JavaScript').codeIn('Python');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment