Mixins
Mixins são um falso padrão de herança múltipla para classes
em JavaScript para o qual o TypeScript tem suporte. O padrão
permite que você crie uma classe que é uma fusão de múltiplas
classes.
Para começar, precisamos de um tipo que usaremos para estender
de outras classes. A principal responsabilidade é declarar
que o tipo que está sendo passado é uma classe.
// Então podemos criar uma série de classes que estendem
a classe final envolvendo-a. Este padrão funciona bem
quando objetos semelhantes têm recursos diferentes.
Este mixin adiciona uma propriedade de escala, com getters e setters
para alterá-lo com uma propriedade privada encapsulada:
type Constructor = new (...args: any[]) => {};
// Este mixin adiciona métodos extras em torno da composição alpha
algo que os computadores modernos usam para criar profundidade:
function Scale
// Aqui nós criamos dois tipos diferentes de sprites
que têm recursos diferentes:
function Alpha
// A criação de instâncias dessas classes mostra que
os objetos têm diferentes conjuntos de propriedades
e métodos devido aos seus mixins:
const ModernDisplaySprite = Alpha(Scale(Sprite));
const EightBitSprite = Scale(Sprite);
// Falha porque um EightBitSprite não tem
o mixin para mudar alphas:
const flappySprite = new ModernDisplaySprite("Bird");
flappySprite.x = 10;
flappySprite.y = 20;
flappySprite.setVisible();
flappySprite.setScale(0.8);
console.log(flappySprite.scale);
const gameBoySprite = new EightBitSprite("L block");
gameBoySprite.setScale(0.3);
// Se você quiser dar mais garantias sobre as classes
que você embrulha, você pode usar um construtor com genéricos.
gameBoySprite.setAlpha(0.5);
// Agora você pode declarar que este mixin só pode ser
aplicado quando a classe base tem uma determinada forma.
type GConstructor
// Podemos então criar um mixin que depende da função
presente no parâmetro para o GConstructor acima.
type Moveable = GConstructor<{ setXYAcceleration: (x: number, y: number) => void }>;
// Não podemos criar este sprite até que haja uma classe
na hierarquia mixin que adiciona setXYAcceleration:
function Jumpable
const UserSprite = new Jumpable(ModernDisplaySprite);