TypeScript初学习 | 青训营笔记

109 阅读5分钟

这是我参与「第四届青训营」笔记创作活动的的第1天

青训营第一天,讲师讲了html的基础知识,由于之前学过,所以简单的复习了一下,没有多花时间,所以决定学习学习typescript,以作之后的项目实践中使用。

首先已知TypeScript 是 JavaScript 的一个超集,支持ES6语法,它的设计目标是开发大型应用,可以编译成纯JavaScript,之后运行在任何浏览器上。

JavaScript 与 TypeScript 的区别

TypeScript 是 JavaScript 的超集,扩展了 JavaScript 的语法,因此现有的 JavaScript 代码可与 TypeScript 一起工作无需任何修改,TypeScript 通过类型注解提供编译时的静态类型检查。

TypeScript 可处理已有的 JavaScript 代码,并只对其中的 TypeScript 代码进行编译。

TypeScript的安装及第一个程序

使用npm命令即可安装成功

npm install -g typescript

首先建立一个ts为结尾的文件,然后输入代码

var message:string = "hello world"
console.log(message);

在终端中打开该文件,首先通过 tsc 命令编译:

tsc Runoob.ts

就得到一个文件名相同、后缀为js的文件,使用 node 命令来执行该 js 代码,就可以得到输出

$ node Runoob.js
Hello World

TypeScript 基础类型

任意类型(any)    字符串类型(string)    数字类型(number)    布尔类型(boolean)
数组             元组                 枚举(emun)          void
null             undefined           never

any类型针对编程时类型不明确的变量使用

let x: any = 1;    // 数字类型
x = 'I am who I am';    // 字符串类型
x = false;    // 布尔类型
let x: number;
x = 1; // 编译正确
x = undefined;    // 编译错误
x = null;    // 编译错误

上面的例子中变量 x 只能是数字类型。如果一个类型可能出现 null 或 undefined, 可以用 | 来支持多种类型,示例代码如下:

let x: number | null | undefined;
x = 1; // 编译正确
x = undefined;    // 编译正确
x = null;    // 编译正确

变量作用域

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)

以上代码使用 tsc 命令编译为 JavaScript 代码为:

var global_num = 12; // 全局变量
var Numbers = /** @class */ (function () {
    function Numbers() {
        this.num_val = 13; // 实例变量
    }
    Numbers.prototype.storeNum = function () {
        var local_num = 14; // 局部变量
    };
    Numbers.sval = 10; // 静态变量
    return Numbers;
}());
console.log("全局变量为: " + global_num);
console.log(Numbers.sval); // 静态变量
var obj = new Numbers();
console.log("实例变量: " + obj.num_val);

执行以上 JavaScript 代码,输出结果为:

全局变量为: 12
10
实例变量: 13

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

error TS2322: Could not find symbol 'local_num'.
此外,TypeScript的运算符,变量声明,条件与循环等都与其他语言大差不差,很容易理解,但在函数中设置返回值类型略有不同,以下举例讲解。
// 函数定义
function greet():string { // 返回一个字符串
    return "Hello World" 
} 
 
function caller() { 
    var msg = greet() // 调用 greet() 函数 
    console.log(msg) 
} 
 
// 调用函数
caller()
  • 实例中定义了函数 greet() ,返回值的类型为 string。
  • greet() 函数通过 return 语句返回给调用它的地方,即变量 msg,之后输出该返回值。 在调用带参数的函数时:
function add(x: number, y: number): number {
    return x + y;
}
console.log(add(1,2))
  • 实例中定义了函数 add() ,返回值的类型为 number。
  • add() 函数中定义了两个 number 类型的参数,函数内将两个参数相加并返回。

可选参数

在 TypeScript 函数里,如果我们定义了参数,则我们必须传入这些参数,除非将这些参数设置为可选,可选参数使用问号标识 ?。

function buildName(firstName: string, lastName: string) {
    return firstName + " " + lastName;
}
 
let result1 = buildName("Bob");                  // 错误,缺少参数
let result2 = buildName("Bob", "Adams", "Sr.");  // 错误,参数太多了
let result3 = buildName("Bob", "Adams");         // 正确

以下实例,我们将 lastName 设置为可选参数:

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");  // 正确

默认参数

我们也可以设置参数的默认值,这样在调用函数的时候,如果不传入该参数的值,则使用默认参数


function calculate_discount(price:number,rate:number = 0.50) { 
    var discount = price * rate; 
    console.log("计算结果: ",discount); 
} 
calculate_discount(1000) 
calculate_discount(1000,0.30)

剩余参数

剩余参数语法允许我们将一个不确定数量的参数作为一个数组传入。

function addNumbers(...nums:number[]) {  
    var i;   
    var sum:number = 0; 
    
    for(i = 0;i<nums.length;i++) { 
       sum = sum + nums[i]; 
    } 
    console.log("和为:",sum) 
 } 
 addNumbers(1,2,3) 
 addNumbers(10,10,10,10,10)

匿名函数

匿名函数在程序运行时动态声明,除了没有函数名外,其他的与标准函数一样。

我们可以将匿名函数赋值给一个变量,这种表达式就成为函数表达式。

var msg = function() { 
    return "hello world"; 
}
console.log(msg())

带参数


var res = function(a:number,b:number) { 
    return a*b;  
}; 
console.log(res(12,2))

总的来说,TypeScript的学习与其他语言差别并不大,而且有了js的基础以后对文档的理解也并不困难,今天先记录到这里,之后再继续学习记录。