类型标注 
- 基础的简单的类型标注 
  
- 基础类型
 - 空和未定义类型
 - 对象类型
 - 数组类型
 - 元组类型
 - 枚举类型
 - 无值类型
 - Never类型
 - 任意类型
 - 未知类型(Version3.0 Added)
      
基础类型 
- 基础类型包含:
string,number,boolean - 标注语法
   
let title: string = '小陈'; 
let n: number = 100; 
let isOk: boolean = true;
  
空和未定义类型 
- 因为在 null 和 undefined 这两种类型有且只有一个值,在标注一个变量为 Null 和 Undefined 类
  型,那就表示该变量不能修改了   
a = null; 
a = 1;
  
- 默认情况下 null 和 undefined 是所有类型的子类型。 就是说可以把 null 和 undefined 其它类型的变量
   
let a: number; 
a = null;
  
- 如果一个变量声明了,但是未赋值,那么该变量的值为 undefined ,但是如果它同时也没有标注类型
  的话,默认类型为 any , any 类型后面有详细说明   
let a: number;
 
  
小技巧  
- 因为 null 和 undefined 都是其它类型的子类型,所以默认情况下会有一些隐藏的问题
   
let a:number; 
a = null; 
a.toFixed(1);
  
 
 小技巧:在配置文件中指定 strictNullChecks 配置为 true ,可以有效的检测 null 或者 undefined ,避免很多常见问题也可以使我们程序编写更加严谨  
  
 
let a:number; 
a = null; 
a.toFixed(1);
  
let ele = document.querySelector('div'); 
if (ele) {
	ele.style.display = 'none'; 
}
  
对象类型 
内置对象类型 
- 在 JavaScript 中,有许多的内置对象,比如:Object、Array、Date……,我们可以通过对象的构造
  函数或者类来进行标注。   
let a: object = {}; 
let arr: Array<number> = [1,2,3]; 
let d1: Date = new Date();
  
自定义对象类型 
- 另外一种情况,许多时候,我们可能需要自定义结构的对象。这个时候,我们可以: 
   
   
字面量标注 
let a: {username: string; age: number} = { 
	username: 'xiaochen', 
	age: 35 
};
a.username; 
a.age; 
a.gender;
  
 
接口 
interface Person { 
	username: string; 
	age: number; 
};
let a: Person = { 
	username: 'zMouse', 
	age: 35 
};
a.username; 
a.age; 
a.gender;
  
- 优点 : 复用性高
 - 缺点 : 接口只能作为类型标注使用,不能作为具体值,它只是一种抽象的结构定义,并不是实体,没有具体功能实现。
   
类与构造函数 
class Person { 
	constructor(public username: string, public age: number) { 
	
	} 
}
a.username; 
a.age; 
a.gender;
  
- 优点 : 功能相对强大,定义实体的同时也定义了对应的类型
 - 缺点 : 复杂,比如只想约束某个函数接收的参数结构,没有必要去定一个类,使用接口会更加简单
   
interface AjaxOptions { 
	url: string; 
	method: string; 
}
function ajax(options: AjaxOptions) {
} 
ajax({
	url: '', 
	method: 'get' 
});
  
扩展  
- 包装对象:
 - JavaScript 中的 String 、 Number 、 Boolean ,我们知道 string 类 型 和 String 类型并不一样,在 TypeScript 中也是不一样的
   
let a: string; 
a = '1'; 
a = new String('1');  
let b: String; 
b = new String('2'); 
b = '2';  
  
数组类型 
- TypeScript 中数组存储的类型必须一致,所以在标注数组类型的时候,同时要标注数组中存储的数据类型
   
使用泛型标注 
let arr1: Array<number> = []; 
arr1.push(100); 
arr1.push('xiaochen');
  
简单标注 
let arr2: string[] = []; 
arr2.push('xiaochen'); 
arr2.push(1);
  
元组类型 
- 元组类型似数组,但是存储的元素类型不必相同,但是需要注意: 
  
- 初始化数据的个数以及对应位置标注类型必须一致
 - 越界数据必须是元组标注中的类型之一(标注越界数据可以不用对应顺序 - 联合类型)
      
let data1: [string, number] = ['xiaochen', 100]; 
data1.push(100); 
data1.push('100'); 
data1.push(true);
  
枚举类型 
- 枚举的作用组织收集一组关联数据的方式,通过枚举我们可以给一组有关联意义的数据赋予一些友好的名字。
   
enum HTTP_CODE { 
	OK = 200, 
	NOT_FOUND = 404, 
	METHOD_NOT_ALLOWED 
};
HTTP_CODE.OK; 
HTTP_CODE.METHOD_NOT_ALLOWED; 
HTTP_CODE.OK = 1;
  
- 注意事项: 
  
- key 不能是数字
 - value 可以是数字,称为 数字类型枚举,也可以是字符串,称为 字符串类型枚举,但不能是其它值,默认为数字:0
 - 枚举值可以省略,如果省略,则: 
    
- 第一个枚举值默认为:0
 - 非第一个枚举值为上一个数字枚举值 + 1
    - 枚举值为只读(常量),初始化后不可修改
      
字符串类型枚举 
 
enum URLS { 
	USER_REGISETER = '/user/register', 
	USER_LOGIN = '/user/login', 
	
	INDEX = 0
}
  
- 注意:如果前一个枚举值类型为字符串,则后续枚举项必须手动赋值
   
 
 小技巧:枚举名称可以是大写,也可以是小写,推荐使用全大写(通常使用全大写的命名方式来  标注值为常量)  
  
无值类型 
- 表示没有任何数据的类型,通常用于标注无返回值函数的返回值类型,函数默认标注类型为: void
   
function fn():void {
 	
}
  
- 在配置文件 
strictNullChecks 为 false 的情况下, undefined 和 null 都可以赋值给 void. - 但是,当配置文件
strictNullChecks 为 true 的情况下,只有 undefined 才可以赋值给 void   
Never类型 
- 当一个函数永远不可能执行 return 的时候,返回的就是 never
   
function fn(): never { 
	throw new Error('error'); 
}
  
- 与 void 不同, void 是执行了return, 只是没有值;never 是不会执行 return ,比如抛出错误,导致函数终止执行
   
任意类型 
- 不确定这个值到底是什么类型或者不需要对该值进行类型检测,就可以标注为 any类型
  let a: any; - 一个变量申明未赋值且未标注类型的情况下,默认为 any 类型
 - 任何类型值都可以赋值给 any 类型
 - any 类型也可以赋值给任意类型
 - any 类型有任意属性和方法
 - 注意:标注为 any 类型,也意味着放弃对该值的类型检测,同时放弃 IDE 的智能提示
   
 
 小技巧:当指定配置文件中 noImplicitAny 配置为 true ,当函数参数出现隐含的 any 类型时报错  
  
未知类型 
- ·unknow·,3.0 版本中新增,属于安全版的 any,但是与 any 不同的是: 
  
- unknow 仅能赋值给 unknow、any
 - unknow 没有任何属性和方法
      
函数类型 
- 在 JavaScript 函数是非常重要的,在 TypeScript 也是如此。同样的,函数也有自己的类型标注格式 
   
   
函数名称( 参数1: 类型, 参数2: 类型... ): 返回值类型;
  
function add(x: number, y: number): number { 
	return x + y; 
}
 
                
                
                
        
        
    
 
 |