啊乌 發表於 2019-7-31 18:07:00

TypeScript入门实例

<h2>  前言</h2>
<p>  TypeScript是JavaScript的超集,微软公司开发,利用es6语法,实现对js的<strong>面向对象编程思想</strong>,写代码的时候会<strong>像强类型语言</strong>一样,指定参数类型、返回值类型,类型不对会报错,但编译后还是js,弱类型语言,就算是报错一样能编译,不影响程序运行,但可能会出现不可预期的bug;</p>
<p>  同时在ts文件里面import引入了它需要的依赖,外部引入这个ts编译好的js就不需要在引入它的依赖了,它内部自己去找依赖,就跟java一样,自动模块的导入,还有就是你在A引入了B,B引入了C,并返回了C类型的属性,这时候你在A实例化B,然后用b.c,能.出C类型的属性、方法,这样大大方便了js开发</p>
<p>&nbsp;</p>
<p>  更多介绍请看:</p>
<p>  中文官网:https://www.tslang.cn/index.html</p>
<p>  中文官网文档:https://www.tslang.cn/docs/home.html</p>
<p>&nbsp;</p>
<p>  本文记录一个TypeScript入门实例,主要内容有:</p>
<p>  接口、类、继承、修饰符、引入jquery</p>
<p>&nbsp;</p>
<h2>  代码</h2>
<p>  PS:一些要点写在了注释里面</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>  按照我之前的这篇《TypeScript环境安装,以及配置idea开发环境》安装好环境后新建一个SpringBoot项目</p>
<p>  大致的项目结构如下</p>
<p><img src="https://img2018.cnblogs.com/blog/1353055/201907/1353055-20190731164011926-1644398487.png" alt=""></p>
<p>&nbsp;  需要用到页面,所以我们引入thymeleaf</p>
<div class="cnblogs_code">
<pre>      <span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">Thymeleaf模板依赖</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">dependency</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
            <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">groupId</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>org.springframework.boot<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">groupId</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
            <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">artifactId</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>spring-boot-starter-thymeleaf<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">artifactId</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">dependency</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p>&nbsp;</p>
<p>  修改默认路径</p>
<div class="cnblogs_code">
<pre>spring.thymeleaf.prefix=classpath:view/
spring.thymeleaf.cache=false</pre>
</div>
<p>  其他常规的依赖我就不说了,还是不清楚的看我的《SpringBoot系列》博客</p>
<p>&nbsp;</p>
<p>  直接在启动类写一个controller访问页面</p>
<div class="cnblogs_code">
<pre>    @GetMapping("/"<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> ModelAndView index(){
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span> ModelAndView("index"<span style="color: rgba(0, 0, 0, 1)">);
    }</span></pre>
</div>
<p>  看一下我们的.ts文件</p>
<p><img src="https://img2018.cnblogs.com/blog/1353055/201907/1353055-20190731170944086-1164770336.png" alt=""></p>
<p>&nbsp;</p>
<p>  tsconfig.json</p>
<p>  项目配置,如果一个目录下存在一个tsconfig.json文件,那么它意味着这个目录是TypeScript项目的根目录。tsconfig.json文件中指定了用来编译这个项目的根文件和编译选项。</p>
<p>  编译项有很多,具体可查阅官网:https://www.tslang.cn/docs/handbook/compiler-options.html</p>
<div class="cnblogs_code">
<pre>{
"compilerOptions": {
    "target": "ES6",//ECMAScript目标版本 "ES3"(默认)
    "module": "ES6",//指定生成哪个模块系统代码,CommonJS(后端,例如node.js)、AMD(浏览器前端)、ES6(前后端结合体)
    "removeComments": true //删除所有注释,除了以 /!*开头的版权信息。
}
}</pre>
</div>
<p>&nbsp;</p>
<p>  Person.ts</p>
<p>  声明一个人类接口</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 人类接口
* 接口的成员变量不能用修饰词修饰
* export 表示导出
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
export interface Person {
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 属性 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
    name</span>?: string;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">姓名</span>
    age?: number;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">年龄</span>

    <span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 方法 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
    toString(): string;
}</span></pre>
</div>
<p>  </p>
<p>  Student.ts</p>
<p>  一个学生类,实现人类接口,同时声明一个班花类,继承学生类</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">导入 文件名后缀 .js 必须要有,不然浏览器无法识别路径</span>
import {Person} from "./Person.js"<span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 学生类
* 实现了Person,必须实现它的属性跟方法
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
export class Student implements Person {
    </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
      看一下有哪些修饰符(与java基本一致)

      公有 public,可以自由的访问程序里定义的成员
      私有 private,不能在声明它的类的外部访问
      受保护 protected,与private修饰符的行为很相似,但有一点不同,protected成员在派生类中仍然可以访问
      静态 static,被修饰的属性存在于类本身上面而不是类的实例
      只读 readonly,设置只读后只能才声明变量时跟在构造参数进行赋值
   </span><span style="color: rgba(0, 128, 0, 1)">*/</span>

    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">属性</span>
    public name?<span style="color: rgba(0, 0, 0, 1)">: string;
    public age</span>?<span style="color: rgba(0, 0, 0, 1)">: number;
    private identity: string </span>= "学生"<span style="color: rgba(0, 0, 0, 1)">;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">构造参数,默认已经创建空构造</span>
<span style="color: rgba(0, 0, 0, 1)">    constructor(name: string, age: number) {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.name =<span style="color: rgba(0, 0, 0, 1)"> name;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.age =<span style="color: rgba(0, 0, 0, 1)"> age;
    }

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">set、get方法</span>
<span style="color: rgba(0, 0, 0, 1)">    set _identity(identity: string) {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.identity =<span style="color: rgba(0, 0, 0, 1)"> identity;
    }

    get _identity() {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.identity;
    }

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">普通方法</span>
<span style="color: rgba(0, 0, 0, 1)">    public toString(): string {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> "name:" + <span style="color: rgba(0, 0, 255, 1)">this</span>.name + " age:" + <span style="color: rgba(0, 0, 255, 1)">this</span>.age + " identity:" + <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.identity;
    }

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">泛型,输入什么类型就输出什么类型</span>
    public static print&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)">(ss: T): T {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> ss;
    }

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">静态方法</span>
<span style="color: rgba(0, 0, 0, 1)">    public static whoIsClassFlower(): string {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ClassFlower().toString();
    }
}

</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 班花
* 继承了Student类
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
class ClassFlower extends Student {
    constructor() {
      </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">
            派生类包含了一个构造函数,它必须调用super(),它会执行基类的构造函数。
            而且,在构造函数里访问this的属性之前,我们一定要调用super()
         </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
      super(</span>"小芳", 18<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.name = "小芳"<span style="color: rgba(0, 0, 0, 1)">;
    }
}</span></pre>
</div>
<p>  </p>
<p>  Main.ts</p>
<p>  Main入口测试</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">导入一个模块中的某个导出内容 文件名后缀 .js 必须要有,不然浏览器无法识别路径</span>
import {Student} from "./Student.js"<span style="color: rgba(0, 0, 0, 1)">;

import $ from </span>"../js/jquery-1.11.0.min.js"<span style="color: rgba(0, 0, 0, 1)">;<br><br></span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 具有副作用的导入模块,尽管不推荐这么做,一些模块会设置一些全局状态供其它模块使用。</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 这些模块可能没有任何的导出或用户根本就不关注它的导出。</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 这样导入会导致编译报错,但并不影响使用</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> import "../js/jquery-1.11.0.min.js";</span>

<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">通过new构造参数创建对象</span>
let student = <span style="color: rgba(0, 0, 255, 1)">new</span> Student("张三", 19<span style="color: rgba(0, 0, 0, 1)">);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调用set、get方法,修改identity学生身份</span>
console.log("当前身份:" +<span style="color: rgba(0, 0, 0, 1)"> student._identity);
student._identity </span>= "还是学生"<span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调用普通方法</span>
<span style="color: rgba(0, 0, 0, 1)">console.log(student.toString());
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调用静态方法</span>
console.log("班花:" +<span style="color: rgba(0, 0, 0, 1)"> Student.whoIsClassFlower());
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">泛型</span>
console.log(<span style="color: rgba(0, 0, 255, 1)">typeof</span> Student.print(1<span style="color: rgba(0, 0, 0, 1)">));
console.log(</span><span style="color: rgba(0, 0, 255, 1)">typeof</span> Student.print("1"<span style="color: rgba(0, 0, 0, 1)">));

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">使用jq操作DOM</span>
$("body").append("&lt;h3&gt;使用jq操作DOM&lt;/h3&gt;"<span style="color: rgba(0, 0, 0, 1)">);</span><span style="color: rgba(0, 128, 0, 1)"><br></span></pre>
</div>
<p>  引入jquery,我们采用的引入具体模块,但现在的jquery-1.11.0.min.js并没有显式的导出$,因此程序会报错</p>
<p><img src="https://img2018.cnblogs.com/blog/1353055/201907/1353055-20190731172423352-1847673233.png" alt=""></p>
<p>  为此,我们在jquery的最后面手动导出默认模块</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">手动导出全局对象</span>
export <span style="color: rgba(0, 0, 255, 1)">default</span> $;</pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/1353055/201907/1353055-20190731172537569-1554367501.png" alt=""></p>
<p>  </p>
<p>  或者我们也可以选择这种导入方式</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 具有副作用的导入模块,尽管不推荐这么做,一些模块会设置一些全局状态供其它模块使用。</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 这些模块可能没有任何的导出或用户根本就不关注它的导出。</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 这样导入会导致编译报错,但并不影响使用</span>
import "../js/jquery-1.11.0.min.js";</pre>
</div>
<p>&nbsp;</p>
<p>  使用下方工具栏编译之后</p>
<p><img src="https://img2018.cnblogs.com/blog/1353055/201907/1353055-20190731170850652-709636931.png" alt=""></p>
<p>&nbsp;  Person.js</p>
<div class="cnblogs_code"><img id="code_img_closed_888bca95-67ac-4801-8e14-cc0948654428" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_888bca95-67ac-4801-8e14-cc0948654428" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_888bca95-67ac-4801-8e14-cc0948654428" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">你没看错,内容就是空,编译后什么都没有</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>&nbsp;</p>
<p>  Student.js</p>
<div class="cnblogs_code"><img id="code_img_closed_79a59ff0-48a6-4487-8288-b1c0eb4e6e0d" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_79a59ff0-48a6-4487-8288-b1c0eb4e6e0d" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_79a59ff0-48a6-4487-8288-b1c0eb4e6e0d" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">export class Student {
    constructor(name, age) {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.identity = "学生"<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.name =<span style="color: rgba(0, 0, 0, 1)"> name;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.age =<span style="color: rgba(0, 0, 0, 1)"> age;
    }
    set _identity(identity) {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.identity =<span style="color: rgba(0, 0, 0, 1)"> identity;
    }
    get _identity() {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.identity;
    }
    toString() {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> "name:" + <span style="color: rgba(0, 0, 255, 1)">this</span>.name + " age:" + <span style="color: rgba(0, 0, 255, 1)">this</span>.age + " identity:" + <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.identity;
    }
    static print(ss) {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> ss;
    }
    static whoIsClassFlower() {
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ClassFlower().toString();
    }
}
class ClassFlower extends Student {
    constructor() {
      super(</span>"小芳", 18<span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.name = "小芳"<span style="color: rgba(0, 0, 0, 1)">;
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>&nbsp;</p>
<p>  Main.js</p>
<div class="cnblogs_code"><img id="code_img_closed_12d8872a-4f22-44ea-b135-fccf5f9443e9" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_12d8872a-4f22-44ea-b135-fccf5f9443e9" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_12d8872a-4f22-44ea-b135-fccf5f9443e9" class="cnblogs_code_hide">
<pre>import { Student } from "./Student.js"<span style="color: rgba(0, 0, 0, 1)">;
import $ from </span>"../js/jquery-1.11.0.min.js"<span style="color: rgba(0, 0, 0, 1)">;
let student </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> Student("张三", 19<span style="color: rgba(0, 0, 0, 1)">);
console.log(</span>"当前身份:" +<span style="color: rgba(0, 0, 0, 1)"> student._identity);
student._identity </span>= "还是学生"<span style="color: rgba(0, 0, 0, 1)">;
console.log(student.toString());
console.log(</span>"班花:" +<span style="color: rgba(0, 0, 0, 1)"> Student.whoIsClassFlower());
console.log(</span><span style="color: rgba(0, 0, 255, 1)">typeof</span> Student.print(1<span style="color: rgba(0, 0, 0, 1)">));
console.log(</span><span style="color: rgba(0, 0, 255, 1)">typeof</span> Student.print("1"<span style="color: rgba(0, 0, 0, 1)">));
$(</span>"body").append("&lt;h3&gt;使用jq操作DOM&lt;/h3&gt;");</pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>&nbsp;</p>
<p>  在HTML页面中引入编译生成的Main.js</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;!</span><span style="color: rgba(255, 0, 255, 1)">DOCTYPE html</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">meta </span><span style="color: rgba(255, 0, 0, 1)">charset</span><span style="color: rgba(0, 0, 255, 1)">="UTF-8"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(128, 0, 0, 1)">
      html, body </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">{</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">
            margin</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)"> 0</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(255, 0, 0, 1)">
            padding</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">:</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)"> 0</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">;</span>
      <span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">}</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)"> script里面要加type="module",这样浏览器才会把相关的代码当作ES6的module来对待 </span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">script </span><span style="color: rgba(255, 0, 0, 1)">th:src</span><span style="color: rgba(0, 0, 255, 1)">="@{ts/Main.js}"</span><span style="color: rgba(255, 0, 0, 1)"> type</span><span style="color: rgba(0, 0, 255, 1)">="module"</span><span style="color: rgba(0, 0, 255, 1)">&gt;&lt;/</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p>  </p>
<h2>  大致效果</h2>
<p>  页面效果</p>
<p><img src="https://img2018.cnblogs.com/blog/1353055/201907/1353055-20190731170546155-294732142.png" alt=""></p>
<h2>&nbsp;  后记</h2>
<p>  大家可以看到,我们再html里就引入了Main.js,它依赖Student.js,Student依赖Person.js,这些依赖关系它会自己去引入,只要在对应的路径有这个文件就可以了,如果是按照之前js的引入方法,我们需要在引入Main之前引入它的依赖,否则就会报错</p>
<p>&nbsp;  这个例子比较简单,我们引入第三方库也是用比较简单、暴力的方式,如需要支持ts,还需要TypeScript 声明文件,具体可以参考一下菜鸟教程:https://www.runoob.com/typescript/ts-ambient.html</p>
<p>&nbsp;</p>
<p>  <span style="color: rgba(255, 0, 0, 1)">补充</span>:2019-08-19补充,每次改完ts代码都要进行一次编译,太麻烦了,可以设置一下自动编译,打开settings,找到Languages &amp; Frameworks 下面的TypeScript,勾选Recompile on changes,就可以开启自动编译了</p>
<p><img src="https://img2018.cnblogs.com/blog/1353055/201908/1353055-20190819145854282-653751442.png" alt=""></p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
   
<div>
        <h3>版权声明</h3>
        <div>作者:huanzi-qch</div>
        <div>出处:https://www.cnblogs.com/huanzi-qch</div>
        <div>若标题中有“转载”字样,则本文版权归原作者所有。若无转载字样,本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.</div>
</div><br/>

<div>
        <h3><span style="color: #4f84b3;cursor: pointer;" onclick="window.open('https://huanzi-qch.github.io/file-server/ad/adservice.html', '_blank')" title="AD广告位服务说明">AD广告位</span>(长期招租,如有需要请私信)</h3>
       
        【阿里云】阿里云最全的优惠活动聚集地!<br/>
        【腾讯云】腾讯云当前最新优惠活动专区!<br/>
    <br/>
</div>

<div>
        <h3>捐献、打赏</h3>
        <div><span style="color: red">请注意:</span>相应的资金支持能更好的持续开源和创作,如果喜欢这篇文章,请随意打赏!</div>
        <div style="text-align: center;">
                <div style="
                        float: left;
                        margin-left: 200px;
                ">
                        <img style="width: 100px;" src="https://huanzi-qch.github.io/file-server/images/zhifubao.png"/>
                        <p>支付宝</p>
                </div>
                <div>
                        <img style="width: 100px;" src="https://huanzi-qch.github.io/file-server/images/weixin.png"/>
                        <p>微信</p>
                </div>
        </div>               
</div><br/>


<div>
        <h3>交流群</h3>
        <div style="text-align: center;">
                有事请加群,有问题进群大家一起交流!<br/>
                <img style="width: 300px;" src="https://huanzi-qch.github.io/file-server/images/qq.png"/>
        </div>
</div><br/><br><br>
来源:https://www.cnblogs.com/huanzi-qch/p/11278130.html
頁: [1]
查看完整版本: TypeScript入门实例