刚看到ts的时候以为是一门新的高深的语言。其实不是的,他只是js的一个超集,把文件名改成ts了,内容上有些增加,所以在ts中直接写es6甚至es5都是可以的(虽然听起来没必要,但是实际是可以这么操作的)。
这篇短文主要介绍了一下ts中新增的重点,变化比较大的主要是变量的使用上和面向对象的实现。当然,还有一些细节,比如函数的使用上以及元组泛型等等。其中变量主要是需要声明数据类型,以及新增了枚举和any,变量的变化同时也改不了函数的参数返回值声明和使用。面向对象很多是es6就改变的,为了使这一部分完整,我这里没有区分es6和ts。
这边小短文没有包括很多细节,主要是我自己做的大致框架。
安装和编译
- 安装ts:
npm install -g typescript - 新建ts文件:".ts"做为文件后缀
- ts编写:支持es6语法,也可以使用es5语法
- 把写好的ts文件编译为js:
hsc 文件名.ts
变量
- ts中的变量声明时需要同时声明数据类型(如果没有显式声明则默认为any类型)
- js中的数据类型包括五种基本数据类型(Number,String,Boolean,Undefined,Null)和一个复杂数据类型(Object)
- ts中的数据类型在js的基础上新增了枚举类型和any
TS新增的数据类型
- 枚举
- 场景:取值被限定在一定范围
- any(任意值)
- 作用:在赋值过程中可以更改为任意数据类型
- 未声明的数据类型都默认为any
数组
type[]:数组类型为type型- 泛型定义数组,给数组中的元素指定类型为type
Array<type> - 用接口表示数组
对象
ts中新增了接口,用于描述对象,具体见下面'面向对象'中的‘接口’部分
联合数据类型:
- 声明:
let a = 数据类型1|数据类型2 - 作用:定义的变量的数据类型为“数据类型1”或者是“数据类型2”
变量声明
var/let 变量名:数据类型
var name: string
函数
- 参数(参数名:数据类型)
- 返回值
function test(name: string): string
面向对象
一.类
(1)声明
class关键字class Vehicle {}
(2)访问修饰符
- public(默认值):公有,都可以访问
- private:私有,不能在类外用,子类也不可以
- protected:保护,可以在子类中用,不能在类外其他地方用
- 使用:
- 修饰变量:"修饰符 变量名"
public first_name - 修饰方法:"修饰符 方法名"
public constructor(a){...}
- 修饰变量:"修饰符 变量名"
(3)属性
- 声明:
变量名:数据类型 - e.g.
class Person {
first_name: string;
last_name: string;
public age: number;
}
(4)方法
-
普通方法
方法名(){}- 使用该类中的属性
this.属性名 - 调用
- 声明变量
var p: Person - 初始化
p = new Person() - 调用
p.greet();
- 声明变量
-
静态方法
- 特点:通过类直接调用,不能通过实例化的对象调用
- 声明:使用static修饰.e.g.
class A { static a(){...} }- 调用:
A.a()
(5)构造函数
- 命名为constructor
- 在类被实例化时调用
- 无返回值
- 作用:通过带参数的构造函数初始化数据
(6)继承
- 声明:extends
class 子类 extends 父类 - 子类调用父类构造函数:使用super关键字
constructor(a) {
super(a)//父类的constructor(a)
}
- 子类调用父类的方法:也是super关键字
super.父类方法名()
(7)抽象类
- 抽象类不能被实例化,只能被子类继承
- 声明--abstract修饰符
abstract class A - 继承
class 子类 extends 抽象类
二.接口interface
接口的作用有两部分,一部分是对对象类型的描述,另一部分是对类的一部分行为的抽象 ####对对象类型的描述
interafce A {
a: string; //a的类型要是string型,且a不能省略
b?: number; //b的类型是number,改属性可以不存在
readynly c :string; //c是只读属性,初始化之后不能再赋值
<!--至此面的对象只能定义属性a和b,不可以多定义其他的属性-->
[propName: string]: any; //可以添加任意属性,但必须是string类型
}
####对类行为的抽象
-
作用:提取不同类(不一定是父子类)的公共方法
-
接口声明:
interface 接口A{ 方法f1(); 方法f2(); } -
类继承接口并实现接口方法:
class 类Aa implements 接口A{ f1(){...} } -
类继承父类的同时继承接口:
class 子类Aa extends 父类B implements 接口A { f1(){...} } -
一个类继承多个接口:
class 子类Aa implements 接口A 接口B{ A的方法f1(){...} A的方法f2(){...} B的方法f3(){...} } -
接口继承接口
interface 接口B extends 接口A{//接口B继承的接口A ... } -
接口继承类
interface 接口B extends 类A{//接口B继承的类A ... }