typescript学习

出差杭州一周,36度的大杭州真是热啊,这两天下雨一下子就降了12度,逛了西湖,烟雨蒙蒙,忍不住就哼唱一句“西湖的美,我的泪….”

废话不多说,收收心,继续努力工作。

TypeScript是一种强类型,面向对象的编译语言。TypeScript既是语言,也是工具。TypeScript是JavaScript类型的超集,可以编译成JavaScript。

为什么使用TypeScript
  • 编译 - JavaScript是解释型语言,需要运行才能知道是否有错。TYpeScript转换器在编译代码时可以进行错误检查,可以在运行之前进行错误检查。
  • 强类型 - JavaScript没有强类型,TypeScript可以约束类型。
  • 面向对象 - 支持类、接口、继承等。

安装

安装TypeScript
sudo npm install -g typescript
创建TypeScript文件

新建一个hello.ts文件:

function hello(person) {
    return 'hello, ' + person;
}

let user = 'summer';

console.log(hello(user));
编译代码

使用命令:

tsc hello.ts

编译结果为一个hello.js文件,包含编译的JavaScript代码。

功能点

类型注解

TypeScript可以给函数或变量添加类型。如:

function hello(person: string) {
    return 'hello, ' + person;
}

let user = [1,2];

console.log(hello(user));

以上代码报错,提示number[]类型与string不匹配。

接口

接口用于类型检查对象是否适合特定的结构。通过定义一个接口,可以命名一个特定的变量组合。

例如:

// 定义Food接口
interface Food {
    name: string;
    calories : number;
}

// 函数接收Food
function speak(food: Food): void{
  console.log("Our " + food.name + " has " + food.calories + " calories.");
}

// 声明一个跟Food属性相同的变量
var ice_cream = {
    name:'ice cream',
    calories: 100
}

speak(ice_cream);

属性的顺序不重要。只需要属性出现并类型正确,否则会报错。

TypeScript提供了与Java类似的面向对象的编码风格,包括继承、抽象类、接口实现、setter/getter等。

目前ES6也已经支持类,只是TypeScript更严格。

如:

class Menu {
    // 属性
    // 默认情况下是公共的
    items: Array<string>;
    pages: number;
    
    // 构造函数
    constructor(item_list: Array<string>, total_pages: number){
        this.items = item_list;
        this.pages = total_pages;
    }
    
    // 方法
    list():void {
        console.log('menu:')
        for(var i = 0;i < this.items.length; i++){
            console.log(this.items[i]);
        }
    }
}

//实例
var menu1 = new Menu(['book','food','package'],1);
menu1.list();

继承:

class HappyMenu extend Menu {
    // 属性被继承
    
    // 重新定义一个新的构造函数
    constructor(item_list: Array<string>, total_pages: number){
        super(item_list,total_pages);
    }
    
    // 方法
    list():void {
        ...
    }
}
    
 // 实例
 var happy1 = new HappyMenu(['summer','minya','toy'],1);
 happy1.list();  
泛型

泛型允许相同函数接受不同类型参数的模板。使用泛型创建可重用组件比使用any数据类型好,因为泛型保留了变量的类型。

例如:

// 函数名称后的<T>表示它是一个通用函数
// 当调用时,T的每个实例都将被实际提供的类型替换

function genFunc<T>(argument: T): T[]{
    var arrayOfT : T[] = [];
    arrayOfT.push(argument);
    return arrayOfT;
}

var arrayFromString = genFunc<string>('summer');
console.log(arrayFromString[0]);// summer
console.log(typeof arrayFromString[0]);//string
模块

TypeScript引入了用于导出和导入模块的语法,但无法处理文件质检的实际连线。要启用外部模块,TS依赖于第三方库,比如浏览器应用程序的require.js或用于Node.js的CommonJS。

例如,两个文件,一个导出一个函数,一个导入并调用它。

export.ts

var hello = function(): void {
    console.log('hello');
}
export = hello;

import.ts

import hello = require('./export');
hello();

编译运行需要添加额外参数告知正在使用require.js

tsc --module amd * .ts

以上是TypeScript学习一个阶段的理论小结。