一、TypeScript 基础语法
1、一个 TypeScript 程序
const hello : string = "Hello World!"
console.log(hello)
以上代码首先通过 tsc 命令编译:
tsc Runoob.ts
得到如下 js 代码:
var hello = "Hello World!";
console.log(hello);
最后我们使用 node 命令来执行该 js 代码。
$ node Runoob.js
Hello World
2、tsc 常用编译参数
tsc 常用编译参数 | 编译参数说明 |
---|---|
–help | 显示帮助信息 |
–module | 载入扩展模块 |
–target | 设置 ECMA 版本 |
–declaration | 额外生成一个 .d.ts 扩展名的文件。tsc ts-hw.ts --declaration 以上命令会生成 ts-hw.d.ts、ts-hw.js 两个文件。 |
–removeComments | 删除文件的注释 |
–out | 编译多个文件并合并到一个输出的文件 |
–sourcemap | 生成一个 sourcemap (.map) 文件。sourcemap 是一个存储源代码与编译代码对应位置映射的信息文件。 |
–module noImplicitAny | 在表达式和声明上有隐含的 any 类型时报错 |
–watch | 在监视模式下运行编译器。会监视输出文件,在它们改变时重新编译。 |
二、TypeScript 基础类型
数据类型 | 关键字 | 描述 |
---|---|---|
任意类型 | any | 声明为 any 的变量可以赋予任意类型的值。 |
数字类型 | number | 双精度 64 位浮点值。它可以用来表示整数和分数。 |
字符串类型 | string | 一个字符系列,使用单引号(')或双引号(")来表示字符串类型。反引号(`)来定义多行文本和内嵌表达式。 |
布尔类型 | boolean | 表示逻辑值:true 和 false。 |
数组类型 | 无 | 声明变量为数组。 |
元组 | 无 | 元组类型用来表示已知元素数量和类型的数组,各元素的类型不必相同,对应位置的类型需要相同。 |
枚举 | enum | 枚举类型用于定义数值集合。 |
void | void | 用于标识方法返回值的类型,表示该方法没有返回值。 |
null | null | 表示对象值缺失。 |
undefined | undefined | 用于初始化变量为一个未定义的值 |
never | never | never 是其它类型(包括 null 和 undefined)的子类型,代表从不会出现的值 |
三、TypeScript 变量声明
1、TypeScript 变量的命名规则
-
变量名称可以包含数字和字母。
-
除了下划线 _ 和美元 $ 符号外,不能包含其他特殊字符,包括空格。
-
变量名不能以数字开头。
实例
var uname:string = "Runoob";
var score1:number = 50;
var score2:number = 42.50
var sum = score1 + score2
console.log("名字: "+uname)
console.log("第一个科目成绩: "+score1)
console.log("第二个科目成绩: "+score2)
console.log("总成绩: "+sum)
2、类型断言(Type Assertion)
类型断言可以用来手动指定一个值的类型,即允许变量从一种类型更改为另一种类型。
语法格式
<类型>值
或
值 as 类型
实例
var str = '1'
var str2:number = <number> <any> str //str、str2 是 string 类型
console.log(str2)
3、类型推断
当类型没有给出时,TypeScript 编译器利用类型推断来推断类型。
如果由于缺乏声明而不能推断出类型,那么它的类型被视作默认的动态 any 类型。
四、TypeScript 运算符
1、算术运算符
运算符 | 描述 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
% | 取模(余数) |
++ | 自增 |
– | 自减 |
2、关系运算符
==、!=、>、<、>=、<=
3、逻辑运算符
&&、||、|
4、短路运算符
&& 与 ||
5、位运算符
&、|、~、^、<<、>>、>>>
五、TypeScript Number
Number 对象是原始数值的包装对象
1、语法
var num = new Number(value);
2、Number 对象属性
属性 | 描述 |
---|---|
MAX_VALUE | 可表示的最大的数,MAX_VALUE 属性值接近于 1.79E+308。大于 MAX_VALUE 的值代表 “Infinity”。 |
MIN_VALUE | 可表示的最小的数,即最接近 0 的正数 (实际上不会变成 0)。最大的负数是 -MIN_VALUE,MIN_VALUE 的值约为 5e-324。小于 MIN_VALUE (“underflow values”) 的值将会转换为 0。 |
NaN | 非数字值(Not-A-Number) |
NEGATIVE_INFINITY | 负无穷大,溢出时返回该值。该值小于 MIN_VALUE |
prototype | Number 对象的静态属性。使您有能力向对象添加属性和方法。 |
POSITIVE_INFINITY | 正无穷大,溢出时返回该值。该值大于 MAX_VALUE。负无穷大,溢出时返回该值。该值小于 MIN_VALUE。 |
constructor | 返回对创建此对象的 Number 函数的引用。 |
3、Number 对象方法
方法 | 描述 |
---|---|
toExponential() | 把对象的值转换为指数计数法 |
toFixed() | 把数字转换为字符串,并对小数点指定位数 |
toLocaleString() | 把数字转换为字符串,使用本地数字格式顺序 |
toPrecision() | 把数字格式化为指定的长度。 |
toString() | 把数字转换为字符串,使用指定的基数。数字的基数是 2 ~ 36 之间的整数。若省略该参数,则使用基数 10。 |
valueOf() | 返回一个 Number 对象的原始数字值。 |
六、TypeScript Array(数组)
数组对象是使用单独的变量名来存储一系列的值
1、语法格式
var array_name[:datatype]; //声明
array_name = [val1,val2,valn..] //初始化
或
var array_name[:datatype] = [val1,val2…valn]
2、Array 对象
(1)、Array 对象的构造函数接受以下两种值
- 表示数组大小的数值。
- 初始化的数组列表,元素使用逗号分隔值。
3、数组解构
可以把数组元素赋值给变量
TypeScript
var arr:number[] = [12,13]
var[x,y] = arr // 将数组的两个元素赋值给变量 x 和 y
console.log(x)
console.log(y)
编译以上代码,得到以下 JavaScript 代码
JavaScript
var arr = [12, 13];
var x = arr[0], y = arr[1]; // 将数组的两个元素赋值给变量 x 和 y
console.log(x);
console.log(y);
结果
12
13
4、数组迭代
TypeScript
var j:any;
var nums:number[] = [1001,1002,1003,1004]
for(j in nums) {
console.log(nums[j])
}
JavaScript
var j;
var nums = [1001, 1002, 1003, 1004];
for (j in nums) {
console.log(nums[j]);
}
输出结果为
1001
1002
1003
1004
5、多维数组
一个数组的元素可以是另外一个数组,这样就构成了多维数组(Multi-dimensional Array)。
TypeScript
var multi:number[][] = [[1,2,3],[23,24,25]]
console.log(multi[0][0])
console.log(multi[0][1])
console.log(multi[0][2])
console.log(multi[1][0])
console.log(multi[1][1])
console.log(multi[1][2])
JavaScript
var multi = [[1, 2, 3], [23, 24, 25]];
console.log(multi[0][0]);
console.log(multi[0][1]);
console.log(multi[0][2]);
console.log(multi[1][0]);
console.log(multi[1][1]);
console.log(multi[1][2]);
输出结果为:
1
2
3
23
24
25
6、数组在函数中的使用
(1)、作为参数传递给函数
TypeScript`
function disp():string[] {
return new Array("Google", "Runoob", "Taobao", "Facebook");
}
var sites:string[] = disp()
for(var i in sites) {
console.log(sites[i])
}
JavaScript
function disp() {
return new Array("Google", "Runoob", "Taobao", "Facebook");
}
var sites = disp();
for (var i in sites) {
console.log(sites[i]);
}
输出结果为:
Google
Runoob
Taobao
Facebook
(2)、作为函数的返回值
TypeScript
function disp():string[] {
return new Array("Google", "Runoob", "Taobao", "Facebook");
}
var sites:string[] = disp()
for(var i in sites) {
console.log(sites[i])
}
JavaScript
function disp() {
return new Array("Google", "Runoob", "Taobao", "Facebook");
}
var sites = disp();
for (var i in sites) {
console.log(sites[i]);
}
输出结果为:
Google
Runoob
Taobao
Facebook
7、数组方法
方法 | 描述 |
---|---|
concat() | 连接两个或更多的数组,并返回结果。 |
every() | 检测数值元素的每个元素是否都符合条件。 |
filter() | 检测数值元素,并返回符合条件所有元素的数组。 |
forEach() | 数组每个元素都执行一次回调函数 |
indexOf() | 搜索数组中的元素,并返回它所在的位置。如果搜索不到,返回值 -1,代表没有此项 |
join() | 把数组的所有元素放入一个字符串。 |
lastIndexOf() | 返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置后向前搜索 |
map() | 通过指定函数处理数组的每个元素,并返回处理后的数组。 |
pop() | 删除数组的最后一个元素并返回删除的元素。 |
push() | 向数组的末尾添加一个或更多元素,并返回新的长度。 |
reduce() | 将数组元素计算为一个值(从左到右)。 |
reduceRight() | 将数组元素计算为一个值(从右到左)。 |
reverse() | 反转数组的元素顺序。 |
shift() | 删除并返回数组的第一个元素 |
slice() | 选取数组的的一部分,并返回一个新数组。 |
some() | 检测数组元素中是否有元素符合指定条件 |
sort() | 对数组的元素进行排序。 |
splice() | 从数组中添加或删除元素。 |
toString() | 把数组转换为字符串,并返回结果。 |
unshift() | 向数组的开头添加一个或更多元素,并返回新的长度。 |
七、TypeScript 接口
接口是一系列抽象方法的声明,是一些方法特征的集合,这些方法都应该是抽象的,需要由具体的类去实现,然后第三方就可以通过这组抽象方法调用,让具体的类执行具体的方法
1、 接口定义
interface interface_name {
}
2、联合类型和接口
TypeScript
interface RunOptions {
program:string;
commandline:string[]|string|(()=>string);
}
// commandline 是字符串
var options:RunOptions = {program:"test1",commandline:"Hello"};
console.log(options.commandline)
// commandline 是字符串数组
options = {program:"test1",commandline:["Hello","World"]};
console.log(options.commandline[0]);
console.log(options.commandline[1]);
// commandline 是一个函数表达式
options = {program:"test1",commandline:()=>{return "**Hello World**";}};
var fn:any = options.commandline;
console.log(fn());
JavaScript
// commandline 是字符串
var options = { program: "test1", commandline: "Hello" };
console.log(options.commandline);
// commandline 是字符串数组
options = { program: "test1", commandline: ["Hello", "World"] };
console.log(options.commandline[0]);
console.log(options.commandline[1]);
// commandline 是一个函数表达式
options = { program: "test1", commandline: function () { return "**Hello World**"; } };
var fn = options.commandline;
console.log(fn());
输出结果为:
Hello
Hello
World
**Hello World**
3、接口继承
接口继承就是说接口可以通过其他接口来扩展自己。
Typescript 允许接口继承多个接口。
继承使用关键字 extends。
(1)、单接口继承语法格式
Child_interface_name extends super_interface_name
(2)、多接口继承语法格式
Child_interface_name extends super_interface1_name, super_interface2_name,…,super_interfaceN_name
继承的各个接口使用逗号 , 分隔。
八、TypeScript 类
TypeScript 是面向对象的 JavaScript。
类描述了所创建的对象共同的属性和方法。
TypeScript 支持面向对象的所有特性,比如 类、接口等。
TypeScript 类定义方式
class class_name {
// 类作用域
}
1、类可以包含的模块(类的数据成员):
-
字段 : 字段是类里面声明的变量。字段表示对象的有关数据。
-
构造函数 : 类实例化时调用,可以为类的对象分配内存。
-
方法 : 方法为对象要执行的操作。
2、创建类的数据成员
TypeScript
class Car {
// 字段
engine:string;
// 构造函数
constructor(engine:string) {
this.engine = engine
}
// 方法
disp():void {
console.log("发动机为 : "+this.engine)
}
}
JavaScript
var Car = /** @class */ (function () {
// 构造函数
function Car(engine) {
this.engine = engine;
}
// 方法
Car.prototype.disp = function () {
console.log("发动机为 : " + this.engine);
};
return Car;
}());
3、创建实例化对象
使用 new 关键字来实例化类的对象,语法格式如下:
var object_name = new class_name([ arguments ])
类实例化时会调用构造函数
var obj = new Car("Engine 1")
类中的字段属性和方法可以使用 . 号来访问
// 访问属性
obj.field_name
// 访问方法
obj.function_name()
4、类的继承
TypeScript 支持继承类,即我们可以在创建类的时候继承一个已存在的类,这个已存在的类称为父类,继承它的类称为子类。
类继承使用关键字 extends,子类除了不能继承父类的私有成员(方法和属性)和构造函数,其他的都可以继承。
TypeScript 一次只能继承一个类,不支持继承多个类,但 TypeScript 支持多重继承(A 继承 B,B 继承 C)。
(1)、语法格式
class child_class_name extends parent_class_name
5、继承类的方法重写
类继承后,子类可以对父类的方法重新定义,这个过程称之为方法的重写。
其中 super 关键字是对父类的直接引用,该关键字可以引用父类的属性和方法
TypeScript
class PrinterClass {
doPrint():void {
console.log("父类的 doPrint() 方法。")
}
}
class StringPrinter extends PrinterClass {
doPrint():void {
super.doPrint() // 调用父类的函数
console.log("子类的 doPrint()方法。")
}
}
JavaScript
var obj = new StringPrinter()
obj.doPrint()
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var PrinterClass = /** @class */ (function () {
function PrinterClass() {
}
PrinterClass.prototype.doPrint = function () {
console.log("父类的 doPrint() 方法。");
};
return PrinterClass;
}());
var StringPrinter = /** @class */ (function (_super) {
__extends(StringPrinter, _super);
function StringPrinter() {
return _super !== null && _super.apply(this, arguments) || this;
}
StringPrinter.prototype.doPrint = function () {
_super.prototype.doPrint.call(this); // 调用父类的函数
console.log("子类的 doPrint()方法。");
};
return StringPrinter;
}(PrinterClass));
var obj = new StringPrinter();
obj.doPrint();
输出结果为
父类的 doPrint() 方法。
子类的 doPrint()方法。