Mixins

作者: 竹林_ | 来源:发表于2019-10-16 11:53 被阅读0次

介绍

除了传统的面向对象继承方式,还有流行一种通过可重用组件创建类的方式,就是联合另一个简单类的代码

// TS中使用混入: Disposable Mixin
class Disposable {
  isDisposed: boolean;
  dispose() {
    this.isDisposed = true;
  }
}
// Activatable Mixin
class Activatable {
  isActive: boolean;
  activate() {
    this.isActive = true;
  }
  deactivate() {
    this.isActive = false;
  }
}

// 没使用extends而是使用implements。 把类当成了接口,仅使用Disposable和Activatable的类型而非其实现
class SmartObject implements Disposable, Activatable {
  constructor(){
    setInterval(() => {
      console.log(this.isActive + ' : ' + this.isDisposed)
    }, 500)
  }
  interact(){
    this.activate();
  }
  // 为将要mixin进来的属性方法创建出占位属性。 这告诉编译器这些成员在运行时是可用的。 这样就能使用mixin带来的便利,虽说需要提前定义一些占位属性
  isDisposed: boolean = false;
  dispose: () => void;
  isActive: boolean = false;
  activate: () => void;
  deactivate: () => void;
}

applyMixins(SmartObject, [Disposable, Activatable]);

let smartObj = new SmartObject();
setTimeout(() => {
  smartObj.interact()
}, 1000)
// 它会遍历mixins上的所有属性,并复制到目标上去,把之前的占位属性替换成真正的实现代码
function applyMixins (derivedCtor: any, baseCtors: any[]){
  baseCtors.forEach(baseCtors => {
    Object.getOwnPropertyNames(baseCtors.prototype).forEach(name => {
      derivedCtor.prototype[name] = baseCtors.prototype[name];
    })
  })
}

三斜线指令

三斜线指令是包含单个XML标签的单行注释,注释的内容会作为编译器指令使用
三斜线引用告诉编译器在编译过程中要引入的额外的文件

三斜线指令仅可以放在包含他的文件的最顶端,一个三斜线指令的前面只能出现单行或多行注释,这包括其他的三斜线指令

如果他出现在一个语句或声明之后,那么他们会被当做普通的单行注释,并且不具有特殊的含义

预处理输入文件:
解析:编译器会对输入文件进行预处理来解析所有三斜线引用指令,在这个过程中,额外的文件会加到编译过程中
查找:查找文件是以一些根文件开始(命令中指定文件或在tsconfig.json中的files列表里的文件),这些根文件按指定的顺序进行预处理。
处理顺序:三斜线引用以他们在文件里出现的顺序,使用深度优先的方式解析
错误:引用不存在的文件会报错,一个文件用三斜线指令引用自己会报错
noResolve:如果指定了noResolve编译选项,三斜线引用会被忽略,他们不会增加新文件,也不会改变给定文件的顺序

若要在.ts文件里声明一个对@types包的依赖,使用--types命令行选项或在tsconfig.json里指定

// 下面指令是三斜线指令中最常见的一种,它用于声明文件间的依赖
/// <reference path = "..." />
// 表明这个文件使用了 @types/node/index.d.ts里面声明的名字; 并且,这个包需要在编译阶段与声明文件一起被包含进来
// 仅当在你需要写一个d.ts文件时才使用这个指令
/// <reference types="node" />
// 这个指令把一个文件标记成默认库。 你会在 lib.d.ts文件和它不同的变体的顶端看到这个注释
/// <reference no-default-lib="true"/>
// 当一些工具需要处理生成的模块时会产生问题,比如 r.js。
// amd-module指令允许给编译器传入一个可选的模块名:
/// <amd-module />
///<amd-module name='NamedModule'/>

相关文章

  • less

    Variables Extend Mixins Parametric Mixins Mixins as Funct...

  • Vue 混入(mixins和Vue.mixin)

    1.mixins和Vue.mixin mixins 混入 (mixins) 是一种分发 Vue 组件中可复用功能的...

  • Dart中的新特性(Mixins)

    什么是Mixins?Mixins的中文意思是混入,即在一个类中混入其他类。首先我们需要知道,Mixins不是接口,...

  • 很棒的文章 swift 协议 、继承的分析.

    Mixins 比继承更好[https://swift.gg/2015/12/15/mixins-over-inhe...

  • Vue 之 Mixins (混入)

    Mixins Mixins是一种分发Vue组件中可复用功能的非常灵活的一种方式。 什么时候使用Mixins 页面的...

  • vue + mixins 使用实例

    mixins可写入的模块 mixins可写入组件export default 中的所有内容。data , meth...

  • mixins

    mixins 混合 (mixins) 是一种分发 Vue[https://www.baidu.com/s?wd=V...

  • mixins

    文章来源Mixins这个词来源于"mixing in"。表示在一个规则集(rule-set)中的一堆属性包含在另一...

  • Mixins

    我们使用 assign 方法把多个对象的成员复制给某个对象: 这里我们把 canEat 和 canWalk 的所...

  • mixins

    mixins就是定义一部分公共的方法或者计算属性,然后混入到各个组件中使用,方便管理与统一修改

网友评论

      本文标题:Mixins

      本文链接:https://www.haomeiwen.com/subject/ldudyctx.html