TypeScript简介
TypeScript是微软开发的一种免费的开源编程语言。它是JavaScript的超集,本质上是给这种语言添加可选的静态类型和基于类的面向对象编程。
类型脚本扩展了JavaScript的语法,因此任何现有的JavaScript程序都可以在类型脚本下工作,而无需更改。TypeScript是为大规模应用程序开发而设计的,它生成JavaScript以保证编译时的兼容性。
TypeScript支持将类型信息的头文件添加到现有的JavaScript库中,这将它的优势扩展到了流行的库,如jQuery、MongoDB、Node.js和D3.js
学习一门语言,首先得把环境弄起来:
* 安装npm:
我就懒得自己写流程,我也是跟着网上的流程做的:npm安装教程 - 每天进步多一点 - 博客园
遇到的问题就是:运行npm install -g typescript 报错 :
原因:1 没有将node_global,node_modules 设置到环境变量path, 2 没有以管理员的身份运行cmd
*安装TypeScript:
安装完成后npm install -g typescript通过这个命令就可以下载安装TypeScript Compiler了
*选择开发工具:
Visual Studio Code (VS Code) 是微软开发的、免费开源、功能强大的轻量级的IDE。
* TypeScript 入门,构建项目的基础知识:
*TypeScript class(类):
*TypeScript modules (模块):
模块是一种创建一组相关变量、函数、类和接口等的方法。它在本地范围内执行,而不是在全局范围内执行。换句话说,在模块中声明的变量、函数、类和接口不能在模块外部直接访问。我们可以使用export关键字创建模块,也可以在其他模块中使用import关键字。
模块通过使用模块加载器导入另一个模块。在运行时,模块加载器负责在执行模块之前定位和执行模块的所有依赖项。JavaScript中最常用的模块加载器是用于Node.js的CommonJS模块加载器和用于Web应用程序的require.js模块加载器。
内部模块在Typescript的早期版本中。它用于将类、接口、函数和变量逻辑分组成一个单元,并可以导出到另一个模块中。模块在最新版本的TypeScript中被命名为命名空间。所以今天,内部模块已经过时了。但是在内部模块上使用名称空间仍然支持它们。
早期版本:
module Validation {
export interface StringValidator {
isAcceptable(s: string): boolean;
}
var lettersRegexp = /^[A-Za-z]+$/;
var numberRegexp = /^[0-9]+$/;
export class LettersOnlyValidator implements StringValidator {
isAcceptable(s: string) {
return lettersRegexp.test(s);
}
}
export class ZipCodeValidator implements StringValidator {
isAcceptable(s: string) {
return s.length === 5 && numberRegexp.test(s);
}
}
}
// 针对以下集合中的字符串做一些简单的测试
var strings = ['Hello', '98052', '101'];
// 使用验证器
var validators: { [s: string]: Validation.StringValidator; } = {};
validators['ZIP code'] = new Validation.ZipCodeValidator();
validators['Letters only'] = new Validation.LettersOnlyValidator();
// 展示每个字符串通过验证器后的结果
strings.forEach(s => {
for (var name in validators) {
console.log('"' + s + '" ' + (validators[name].isAcceptable(s) ? ' matches ' : ' does not match ') + name);
}
});
ECMAScript 2015内部模块语法:
namespace Validation {
export interface StringValidator {
isAcceptable(s: string): boolean;
}
...
}
1. 拆分 文件:有时候一个模块的代码太长,在同一个文件的话,上千行,万行的代码,不利于管理和阅读,我们可以把它拆分成多个文件,但是他们还是属于同一个文件。
2. 编译输出和加载:
一旦有多个文件参与项目,我们得确保所需编译的代码是否都已加载,有两种方式可以实现。
1)合并编译输出到一个js 文件:
tsc --out your.js Validation.ts LettersOnlyValidator.ts ZipCodeValidator.ts Test.ts
2)分别编译输出对应的js文件,再有序的加载:
<script src="Validation.js" type="text/javascript"></script />
<script src="LettersOnlyValidator.js" type="text/javascript"></script />
<script src="ZipCodeValidator.js" type="text/javascript"></script />
<script src="Test.js" type="text/javascript"></script />
3.外部模块:
外部模块也称为模块。当应用程序包含数百个文件时,如果没有模块化方法,几乎不可能处理这些文件。外部模块用于指定多个外部js文件之间的加载依赖关系。如果应用程序只有一个js文件,那么外部模块就不相关。ECMAScript 2015(ES6)模块系统将每个文件视为一个模块。
1)模块的声明:使用export来声明一个模块
例如,addition.ts:
export class Addition{
constructor(private x?: number, private y?: number){
}
Sum(){
console.log("SUM: " +(this.x + this.y));
}
}
2)在test.ts中访问使用Addition模块:
import {Addition} from './addition';
let addObject = new Addition(10, 20);
addObject.Sum();
3)在一个文件中导入多个模块
import { export_name1, export_name2 } from 'module_name';
4)编译和执行多个模块
$ tsc --module commonjs app.ts
$ node ./app.js
5)重新导出:
Module.ts:
export class Addition{
constructor(private x?: number, private y?: number){
}
Sum(){
console.log("SUM: " +(this.x + this.y));
}
}
re-export .ts:
// 从模块文件中重新导出Addition as plus
export { Addition as plus } from "./Modules";
test.ts: 测试导入转口文件中的模块
//从转口文件导入导出类型
import {plus as Addition} from './re-exports'; //导入plus as Addition
let addObject = new Addition(10, 20);
addObject.Sum();
注意:内部模块在最新版本的TypeScript中被命名为命名空间,而外部模块简称模块。
命名空间和模块的区别:
命名空间:内部模块,主要用于组织代码,避免命名冲突。
模块: ts的外部模块的简称,侧重代码的复用,一个模块里可能会有多个命名空间。