typescript

114 阅读8分钟

第一章TypeScript入门

一.TypeScript是什么

  • TypeScript 是 JavaScript 的一个严格超集。
  • 由于 TypeScript 是 JavaScript 的严格超集,任何现有的js代码都是符合 TypeScript 标准的。
  • 通俗的讲,就是你可以在.ts文件内写JavaScript代码。
  • TypeScript 在 JavaScript的基础上,添加了可选的静态类型。
  • TS 支持 ECMAScript 6 标准。
  • TypeScript 设计目标是开发大型应用,然后转译成 JavaScript。
  • TypeScript由微软开发的自由和开源的编程语言。
  • TypeScript设计目标是开发大型应用,它可以编译成纯js,编译出来的js可以运行在任何浏览器上

二.TypeScript 安装

  • 安装TypeScript环境需要先安装Node.js。
  • 如果你的本地环境已经安装了npm工具,可以直接使用命令来安装:
  • 安装完成后我们可以使用 tsc 命令来执行 TypeScript 的相关代码,以下是查看版本号:
npm install -g typescript
tsc -v  //Version 3.9.7  

三.TypeScript 基础类型

注意:TypeScript 没有整数类型。

1.任意类型 (any)

  • 任意值用来表示允许赋值为任意类型。
  • 声明一个变量为任意值之后,对它的任何操作,返回的内容的类型都是任意值。
  • 任意值是 TypeScript 针对编程时类型不明确的变量使用的一种数据类型,它常用于以下三种情况。
  1. 变量的值会动态改变时 变量的值会动态改变时,比如来自用户的输入,任意值类型可以让这些变量跳过编译阶段的类型检查,示例代码如下: 
let xany = 1;    // 数字类型  
x = 'I am who I am';    // 字符串类型  
x = false;    // 布尔类型  
  1. 改写现有代码时 改写现有代码时,任意值允许在编译时可选择地包含或移除类型检查,示例代码如下:
let xany = 4;  
x.ifItExists();//正确,ifItExists方法在运行时可能存在,但这里并不会检查  
x.toFixed();    // 正确  
  1. 定义存储各种类型数据的数组时
let arrayListany[] = [1false'fine'];  
arrayList[1] = 100;  

2. 数字类型 (number)

描述:双精度 64 位浮点值。它可以用来表示整数和分数。

let binaryLiteralnumber = 0b1010// 二进制  
let octalLiteralnumber = 0o744;    // 八进制  
let decLiteralnumber = 6;    // 十进制  
let hexLiteralnumber = 0xf00d;    // 十六进制  

3 字符串类型 (string)

描述:使用单引号('')或双引号("")来表示字符串类型。反引号(``)来定义多行文本和内嵌表达式。

let namestring = "axihe";  
let yearsnumber = 2;  
let wordsstring = `您好,今年是 ${ name } 发布 ${ years + 1} 周年   

4 布尔类型 (boolean)

描述:表示逻辑值:true 和 false。

let flagboolean = true;  

5 数组类型 (无)

描述:声明变量为数组。

let arrnumber[] = [12];  // 在元素类型后面加上[] 
let arrArray<number> = [12];  // 或者使用数组泛型

6 元组 (无)

描述:元组类型用来表示已知元素数量和类型的数组,各元素的类型不必相同,对应位置的类型需要相同。

let x: [stringnumber];  
    x = ['axihe'1];    // 运行正常  
    x = [1'axihe'];    // 报错  
console.log(x[0]);    // 输出 axihe  

7 枚举 (enum)

描述:枚举类型用于定义数值集合。

enum Color {RedGreenBlue};  
let cColor = Color.Blue;  
console.log(c);    // 输出 2  

8 空值(void)

JavaScript 没有空值(Void)的概念,在 TypeScript 中,可以用 void 表示没有任何返回值的函数:

function alertName(): void {
    alert('My name is Tom');
}

声明一个 void 类型的变量没有什么用,因为你只能将它赋值为 undefined 和 null:

let unusable: void = undefined;

9 null / undefined

  1. null (null)
  • 描述:表示对象值缺失。 在 JavaScript 中 null 表示 “什么都没有”。
  • null 是一个只有一个值的特殊类型。表示一个空对象引用。
  • 用 typeof 检测 null 返回是 object。
  1. undefined (undefined)
  • 描述:用于初始化变量为一个未定义的值
  • 在 JavaScript 中,undefined 是一个没有设置值的变量。
  • typeof 一个没有值的变量会返回 undefined。

在 TypeScript 中,可以使用 null 和 undefined 来定义这两个原始数据类型:

let u: undefined = undefined;
let n: null = null;

与 void 的区别是,undefined 和 null 是所有类型的子类型。也就是说 undefined 类型的变量,可以赋值给 number 类型的变量:

let num: number = undefined; // 这样不会报错
let u: undefined;  // 这样也不会报错
let num: number = u;

而 void 类型的变量不能赋值给 number 类型的变量:

let u: void;
let num: number = u;
// Type 'void' is not assignable to type 'number'.

四.TypeScript 变量声明

变量是一种使用方便的占位符,用于引用计算机内存地址。 我们可以把变量看做存储数据的容器。

1.TypeScript 变量的命名规则

  • 变量名称可以包含数字和字母。
  • 除了下划线 _ 和美元 $ 符号外,不能包含其他特殊字符,包括空格。
  • 变量名不能以数字开头。
  • 变量必须先声明后使用,我们可以使用 var 来声明变量。

2.声明变量的四种方式

(1)声明变量的类型及初始值:

var [变量名] : [类型] = 值;  
var uname:string = "axihe"//举例  

(2)声明变量的类型及但没有初始值,变量值会设置为 undefined:

var [变量名] : [类型];  
var uname:string// 举例 

(3)声明变量并初始值,但不设置类型类型,该变量可以是任意类型:

var [变量名] : [类型];  
var uname:string// 举例  

(4)声明变量没有设置类型和初始值,类型可以是任意类型,默认初始值为 undefined:

var [变量名];  
var uname;// 举例  
实例
var uname:string = "axihe";  
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)  

注意:变量不要使用 name 否则会与 DOM 中的全局 window 对象下的 name 属性出现了重名。 执行代码输出结果为:

名字: axihe  
第一个科目成绩: 50  
第二个科目成绩: 42.5  
总成绩: 92.5  

TypeScript 遵循强类型,如果将不同的类型赋值给变量会编译错误,如下实例:

var num:number = "hello"     // 这个代码会编译错误  

3. 类型断言(Type Assertion)

类型断言可以用来手动指定一个值的类型,即允许变量从一种类型更改为另一种类型。

语法格式:尖括号语法

<类型>值  

或:as语法

值 as 类型  
实例
var str = '1'  
var str2:number = <number> <any> str   //str、str2 是 string 类型  
console.log(str2)

(1)TypeScript 是怎么确定单个断言是否足够?

当S类型是T类型的子集,或者T类型是S类型的子集时,S能被成功断言成S。这是为了在进行类型断言时提供额外的安全性,完全毫无根据的断言是危险的,如果你想这么做,你可以使用 any。

它之所以不被称为类型转换,是因为转换通常意味着某种运行时的支持。但是,类型断言纯粹是一个编译时语法,同时,它也是一种为编译器提供关于如何分析代码的方法。

编译后,以上代码会生成如下 JavaScript 代码:
var str = '1';  
var str2 = str;  //str、str2 是 string 类型  
console.log(str2); // 1  

4. 类型推断

当类型没有给出时,TypeScript 编译器利用类型推断来推断类型。 如果由于缺乏声明而不能推断出类型,那么它的类型被视作默认的动态 any 类型。

var num = 2;    // 类型推断为 number  
console.log("num 变量的值为 "+num);  
num = "12";    // 编译错误  
console.log(num);  

第一行代码声明了变量 num 并 = 设置初始值为 2。 注意变量声明没有指定类型。因此,程序使用类型推断来确定变量的数据类型,第一次赋值为 2,num 设置为 number 类型。 第三行代码,当我们再次为变量设置字符串类型的值时,这时编译会错误。因为变量已经设置为了 number 类型。

error TS2322Type '"12"' is not assignable to type 'number'.  

5. 变量作用域

变量作用域指定了变量定义的位置。 程序中变量的可用性由变量作用域决定。 TypeScript 有以下几种作用域:

  • 全局作用域 − 全局变量定义在程序结构的外部,它可以在你代码的任何位置使用。
  • 类作用域 − 这个变量也可以称为 字段。类变量声明在一个类里头,但在类的方法外面。 该变量可以通过类的对象来访问。类变量也可以是静态的,静态的变量可以通过类名直接访问。
  • 局部作用域 − 局部变量,局部变量只能在声明它的一个代码块(如:方法)中使用。
以下实例说明了三种作用域的使用:
var global_num = 12          // 全局变量  
class Numbers {  
   num_val = 13;             // 实例变量  
   static sval = 10;         // 静态变量  
   storeNum():void {  
      var local_num = 14;    // 局部变量  
   }  
}  
console.log("全局变量为: "+global_num)  
console.log(Numbers.sval)   // 静态变量  
var obj = new Numbers();  
console.log("实例变量: "+obj.num_val)  
执行代码输出结果为:
全局变量为: 12  
10  
类变量: 13  

如果我们在方法外部调用局部变量 local_num,会报错:

error TS2322Could not find symbol 'local_num'.