第一章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 针对编程时类型不明确的变量使用的一种数据类型,它常用于以下三种情况。
- 变量的值会动态改变时 变量的值会动态改变时,比如来自用户的输入,任意值类型可以让这些变量跳过编译阶段的类型检查,示例代码如下:
let x: any = 1; // 数字类型
x = 'I am who I am'; // 字符串类型
x = false; // 布尔类型
- 改写现有代码时 改写现有代码时,任意值允许在编译时可选择地包含或移除类型检查,示例代码如下:
let x: any = 4;
x.ifItExists();//正确,ifItExists方法在运行时可能存在,但这里并不会检查
x.toFixed(); // 正确
- 定义存储各种类型数据的数组时
let arrayList: any[] = [1, false, 'fine'];
arrayList[1] = 100;
2. 数字类型 (number)
描述:双精度 64 位浮点值。它可以用来表示整数和分数。
let binaryLiteral: number = 0b1010; // 二进制
let octalLiteral: number = 0o744; // 八进制
let decLiteral: number = 6; // 十进制
let hexLiteral: number = 0xf00d; // 十六进制
3 字符串类型 (string)
描述:使用单引号('')或双引号("")来表示字符串类型。反引号(``)来定义多行文本和内嵌表达式。
let name: string = "axihe";
let years: number = 2;
let words: string = `您好,今年是 ${ name } 发布 ${ years + 1} 周年
4 布尔类型 (boolean)
描述:表示逻辑值:true 和 false。
let flag: boolean = true;
5 数组类型 (无)
描述:声明变量为数组。
let arr: number[] = [1, 2]; // 在元素类型后面加上[]
let arr: Array<number> = [1, 2]; // 或者使用数组泛型
6 元组 (无)
描述:元组类型用来表示已知元素数量和类型的数组,各元素的类型不必相同,对应位置的类型需要相同。
let x: [string, number];
x = ['axihe', 1]; // 运行正常
x = [1, 'axihe']; // 报错
console.log(x[0]); // 输出 axihe
7 枚举 (enum)
描述:枚举类型用于定义数值集合。
enum Color {Red, Green, Blue};
let c: Color = 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
- null (null)
- 描述:表示对象值缺失。 在 JavaScript 中 null 表示 “什么都没有”。
- null 是一个只有一个值的特殊类型。表示一个空对象引用。
- 用 typeof 检测 null 返回是 object。
- 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 TS2322: Type '"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 TS2322: Could not find symbol 'local_num'.