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'/>
    

    相关文章

      网友评论

          本文标题:Mixins

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