项目作者: aholstenson

项目描述 :
Composition and mixins for JavaScript and TypeScript classes
高级语言: TypeScript
项目地址: git://github.com/aholstenson/foibles.git
创建时间: 2017-09-13T19:15:59Z
项目社区:https://github.com/aholstenson/foibles

开源协议:MIT License

下载


Foibles

npm version
Build Status
Coverage Status
Dependencies

foible. A quirk, idiosyncrasy, or mannerism; unusual habit or way (usage is typically plural), that is slightly strange or silly. Wiktionary

Foibles is a library for composing JavaScript and TypeScript classes using
a mixin pattern.

Foibles is available on NPM: npm install foibles

Creating mixins

Mixins are functions that creates a class that have a dynamic super class. This
makes it so that things as super work as intended and that mixins can override
functions in their parent class.

  1. import { toMixin } from 'foibles';
  2. const SomeMixin = toMixin(base => class MixinClass extends base {
  3. doMixinStuff() {
  4. console.log('mixin did stuff');
  5. }
  6. });

For TypeScript you should also define the type, to enable you to build
functions that consume any object with the mixin:

  1. import { Mixin } from 'foibles';
  2. type SomeMixin = Mixin<typeof SomeMixin>;

If you want to extend a specific class you can use typeof BaseClass to do so:

  1. const SomeMixin = toMixin((base: typeof BaseClass) => class extends base {
  2. ...
  3. })

Creating a base class

To create an extendable class call toExtendable:

  1. import { toExtendable } from 'foibles';
  2. const BaseType = toExtendable(class BaseClass {
  3. doStuff() {
  4. console.log('base class did stuff');
  5. }
  6. });

For TypeScript you should also define the type, to enable you to build
functions that consume the base type:

  1. import { Extendable } from 'foibles';
  2. type BaseType = Extendable<typeof BaseType>;

Using mixins

BaseType will be enhanced with a static with function that provides
the mixin functionality. To sub class BaseType and at the same time
use SomeMixin:

  1. class SubClass extends BaseType.with(SomeMixin) {
  2. doStuff() {
  3. // Allow super class to do stuff
  4. super.doStuff();
  5. // doMixinStuff was provided via SomeMixin
  6. this.doMixinStuff();
  7. }
  8. }

Use instanceof to check if an object has a mixin:

  1. const object = new SubClass();
  2. console.log(object instanceof SubClass);

Note: It’s possible to use instanceof only if Symbol.hasInstance is supported.
Check compatibility at MDN

Creating a mixin depending on other mixins

This library supports a mixin to depend on other mixins by applying them as
needed in the mixin function:

  1. // Define the first mixin
  2. const Debug = toMixin(base => class Debug extends base {
  3. debug(...args) {
  4. console.log(...args);
  5. }
  6. });
  7. // Create a mixin that applies the Debug mixin to base
  8. const Mixin = toMixin(base => class Mixin extends base.with(Debug) {
  9. ...
  10. });