TypeScript与面向对象
TypeScript支持面向对象编程
1  | class Site {  | 
上述代码定义了一个类Site,其中包含一个方法name(),new为创建类的对象的关键字。
编译后JS代码如下
1  | var Site = /** @class */ (function () {  | 
注意。class是TypeScript独有的,JavaScript中使用构造器(函数)和new关键字来实现对象的创建,而没有类的概念。
JavaScript中的对象
使用let和{}来为对象赋值,一般的键值对叫属性,可以使用.或[]来访问,使用delete删除某一属性。
1  | let user = {  | 
可以使用for...in...来遍历对象中属性与值。
对象中可以内嵌方法函数,类比C++中的成员函数。
JavaScript中也存在this关键字,不同于C++,这个this不是指向该对象的指针,而代表该对象。
这边对象的构造函数不同于C++,并不是成员函数,而是普通的常规函数,但是其有两个约定:
- 它们的命名以大写字母开头
 - 它们只能由
new操作符来执行 
TypeScript基础类型
Any类型
任意值是 TypeScript 针对编程时类型不明确的变量使用的一种数据类型,它常用于以下三种情况:
变量的值会动态改变时,比如来自用户的输入,任意值类型可以让这些变量跳过编译阶段的类型检查,示例代码如下:
1
2
3let x: any = 1; // 数字类型
x = 'I am who I am'; // 字符串类型
x = false; // 布尔类型改写现有代码时,任意值允许在编译时可选择地包含或移除类型检查,示例代码如下:
1
2
3let x: any = 4;
x.ifItExists(); // 正确,ifItExists方法在运行时可能存在,但这里并不会检查
x.toFixed(); // 正确定义存储各种类型数据的数组时,示例代码如下:
1
2let arrayList: any[] = [1, false, 'fine'];
arrayList[1] = 100;
NULL和Undefine
null是一个只有一个值的特殊类型,undefine是一个没有设置值的变量。
以上。
never类型
never是其它类(包括null和undefined)的子类型,代表从不会出现的值。这意味着声明为never类型的变量只能被never类型所赋值,在函数中它通常表现为抛出异常或无法执行到终止点(例如无限循环)。
1  | let x: never;  | 
还有一些常见类型
…
TypeScript变量声明
这下变量的声明终于和其他编程语言相似了。有以下几种方式:
声明变量的类型及初始值
1  | let uname:string = "Runoob";  | 
声明变量的类型,但没有初始值,变量值会设置为undefined
1  | var uname:string;  | 
声明变量并初始值,但不设置类型,该变量可以是任意类型
1  | var uname = "Runoob";  | 
声明变量没有设置类型和初始值,类型可以是任意类型,默认初始值为 undefined
1  | var uname;  | 
对于类型出现的错误,TyprScript会在编译的时候进行报错。
类型断言
即指定某一变量的类型,通常适用于一种类型是类外一种类型的子类型。该语法仅仅是为了在编译时进行判断,对实际的程序没有运行支持,故不能称之为类型转换。
1  | <类型>值  | 
例如:可以将any断言成任何类型,或将任何类型断言成never
类型推断
当某一变量的类型没有给出时,TypeScript编译器会使用类型推断来判断类型。若缺乏依据,则将类型判断成any类型。
变量作用域
变量作用域指定了变量定义的位置。程序中变量的可用性由变量作用域决定。
TypeScript中有三种作用域:
- 全局作用域
 - 类作用域
声明在类中,在方法外,但是可以通过类的对象来访问。静态对象可以通过类名直接访问。 - 局部作用域
只能在声明它的代码块中使用
(基本与C++中差不多) 
实例:
1  | var global_num = 12 // 全局变量  | 
TypeScript运算符
TypeScript中存在包括typeof在内的所有在C/C++中常见的运算符。
以上。
TypeScript条件语句
- if、if-else、if-else if-else
 - switch
 
以上。
TypeScript循环
for循环
基本语法和其他几个语言一致。
1  | for ( init; condition; increment ){  | 
for…in
for…in语句用于一组值的集合或列表进行迭代输出。
1  | for (var val in list) {  | 
val需要为string或者any类型
实例:
1  | var j:any;  | 
for…of
for…of语句创建一个循环来迭代可迭代的对象。在ES6中引入的for…of循环,以替代 for…in 和 forEach() ,并支持新的迭代协议。
1  | // for...in 循环示例  | 
while、do…while循环
以上。
TypeScript函数
与JavaScript的区别主要在参数和返回值上。
函数返回值
1  | function function_name():return_type {  | 
- return_type是返回值的类型。
 - value的类型应该与return_type一致
 
带参数函数
1  | function add(x: number, y: number): number {  | 
可选参数和默认参数
可选
实例:
1  | function buildName(firstName: string, lastName?: string) {  | 
默认
1  | function calculate_discount(price:number,rate:number = 0.50) {  | 
剩余参数
即将最后一个形参设置为由剩余参数组成的数组,索引值由0到.length()。
实例:
1  | function addNumbers(...nums:number[]) {  | 
匿名函数
即没有函数名的函数,一般用作函数表达式。在函数后直接使用(),即为匿名函数的子调用。
构造函数
感觉用不上,先放着。😢