Last active
September 28, 2023 17:38
-
-
Save EricsonWillians/e1876ddc9dc85eadec4bf31cb1606823 to your computer and use it in GitHub Desktop.
Fancy Stherzada Generics
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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