在学习ts之前,先聊一下js,js开发起来快,但是维护起来的成本会高,不适合开发大型的项目,js中没有变量类型,例如let a = 10,10是num,但是a是没有变量类型的,它只是一个局部变量,想存什么,存什么,你在其他地方又把a赋值了一个字符串,但是到头来你想拿a去做运算,那么这个时候就会发生隐患事故了,js不报错。js中定义函数,函数的参数也是没有类型,参数做运算,这个时候就会发生错误了,js是一个动态类型,无论是webstorm 还是vscode,它的提示都不是很完善,因为编辑器不知道它的变量类型。那么js是怎么来的呢,是微软和网景两大公司大战时,网景公司为了开发出的我有你没有的商业份额,天下武功唯快不破,因此js十天左右诞生了,微软公司近几年干的好事就是开发出来了vscode免费供开发者使用,开发出ts更加灵活使用,还有放弃了IE内核转而拥抱了chorm内核
TS并不是取代js,而是在javascirpt为基础构建的语言,即是js的超集,什么是超集,就是js有的,ts也有,但是ts在js的基础上又添加了其他
学习TypeScript先从安装开始
@[toc]
一、安装
- 先安装nodejs:https://nodejs.org/dist/v14.15.1-x64.msi
- 更换npm源:
npm config set registry https://registry.npmmirror.com
- 安装 typescript:
npm install -g typescript
- 安装完成后我们可以使用 tsc 命令来执行 TypeScript 的相关代码,以下是查看版本号:
$ tsc -v
二、案例切入
- 新建一个 app.ts 的文件,代码如下:
var message:string = "Hello World"
console.log(message)
通常我们使用 .ts 作为 TypeScript 代码文件的扩展名。
- 转换为
js
然后执行以下命令将 TypeScript 转换为 JavaScript 代码:
tsc app.ts
- 执行编译
使用 node 命令来执行 app.js 文件:
$ node app.js
三、语法
1、数据类型
数据类型 | 描述 |
---|---|
任意类型 any | 声明为 any 的变量可以赋予任意类型的值。 |
数字类型 number | let binaryLiteral: number = 0b1010; // 二进制 let octalLiteral: number = 0o744; // 八进制 let decLiteral: number = 6; // 十进制 let hexLiteral: number = 0xf00d; // 十六进制 |
字符串类型 string | let words: string = `您好,今年是 ${ name } 发布 ${ years + 1} 周年`; |
布尔类型 boolean | let flag: boolean = true; |
数组类型 | let arr: number[] = [1, 2];// 在元素类型后面加上[] |
元组 | 元组类型用来表示已知元素数量和类型的数组,各元素的类型不必相同,对应位置的类型需要相同。let x: [string, number]; x = ['Runoob', 1]; // 运行正常 x = [1, 'Runoob']; // 报错 |
枚举 enum | enum Color {Red, Green, Blue}; let c: Color = Color.Blue; console.log(c); // 输出 2 |
void | function hello(): void {alert("Hello Runoob");} |
null | 表示对象值缺失 |
undefined | 用于初始化变量为一个未定义的值 |
never | never 是其他类型(包括 null 和 undefined)的子类型,代表从不会出现的值 |
==注意==:TypeScript 和 JavaScript 没有整数类型。
2、变量声明
TypeScript 变量的命名规则:
变量名称可以包含数字和字母。
除了下划线 _ 和美元 $ 符号外,不能包含其他特殊字符,包括空格。
变量名不能以数字开头。
- 声明变量的类型及初始值:
var [变量名] : [类型] = 值;
var uname:string = "Runoob";
- 声明变量的类型,但没有初始值,变量值会设置为 undefined:
var [变量名] : [类型];
var uname:string;
- 声明变量并初始值,但不设置类型,该变量可以是任意类型:
var [变量名] = 值;
var uname = "Runoob";
- 声明变量没有设置类型和初始值,类型可以是任意类型,默认初始值为 undefined:
var [变量名];
var uname;
3、函数定义
3.1、函数定义
可选参数使用问号标识 ?
```javascript
function buildName(firstName: string, lastName?: string) {
if (lastName)
return firstName + " " + lastName;
else
return firstName;
}
let result1 = buildName("Bob"); // 正确
let result2 = buildName("Bob", "Adams", "Sr."); // 错误,参数太多了
let result3 = buildName("Bob", "Adams"); // 正确
### 3.2、匿名函数
```javascript
var res = function(a:number,b:number) {
return a*b;
};
console.log(res(12,2))
3.3、匿名函数自调用
(function () {
var x = "Hello!!";
console.log(x)
})()
3.4、构造函数
var myFunction = new Function("a", "b", "return a * b");
var x = myFunction(4, 3);
console.log(x);
3.5、递归函数
通俗理解:从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?'从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……'"
function factorial(number) {
if (number <= 0) {
// 停止执行
return 1;
} else {
return (number * factorial(number - 1)); // 调用自身
}
};
console.log(factorial(6)); // 输出 720
3.6、Lambda 函数
var foo = (x:number)=>10 + x
console.log(foo(100)) //输出结果为 110
3.7、函数重载
重载是方法名字相同,而参数不同,返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
function disp(s1:string):void;
function disp(n1:number,s1:string):void;
function disp(x:any,y?:any):void {
console.log(x);
console.log(y);
}
disp("abc")
disp(1,"xyz");