0)前言
类型注解
作用:相当于强类型语言中的类型声明;
语法:(函数/变量): type
联合类型
// 可以是number,也可以是string
let arr2: Array<number | string> =[1,2,3,'4'];
Typescript VS ES6数据类型
数组(Array)
// 定义数组有两种方法:
let myArr: number[] = [1, 2, 3];
// <> 里面是类型名称(泛型)
let myArr: Array<boolean> = [false, false, true];
元组(tuple)
与数组类似,但是里面的元素是可以多个类型,编译出来的 JavaScript 也是数组
元素的个数是固定的,顺序不能变。
// tuple
// 定义
let my_tuple: [string, number];
// 赋值
my_tuple = ["jiang", 100];
tuple的越界问题
my_tuple.push(2)
// ['jiang',100, 2]
console.log(my_tuple);
//error 调用会出错:下标越界问题
my_tuple(2);
函数(function)
指定返回值类型
可以让调用者知道是什么类型的返回值,以便进行处理
通常,返回值的类型是可以省略的,因为TS会做自动推断。
// void 代表什么也不返回
const add = (a: number, b: number): void => {
console.log(a + b)
}
默认参数与可选参数
- 默认参数(=),可选参数(?),一般放到参数后面
- 默认参数可以不指定类型,会自动判断和计算
const add = (a: number, b = 10, c?: number): void => {
if (b) {
console.log(a + b);
} else {
console.log(a);
}
}
let sum = add(20, 20);
console.log(sum);
函数的定于与实现
// 函数定义
let compute: (x:number,y:number) => number;
// 函数实现
compute = (a,b) => a + b;
对象(Object)
类型“object”上不存在属性“x”
let obj:object= {x:1,y:2}
obj.x =3 //error 类型“object"上不存在属性“x"
// 正确的做法
let obj2: {x:number,y:number} = {x:1,y:2}
obj2.x =3
类(Class)
ts是面向对象的语言,具有以下特性:
- 面向对象 - 继承与多态
- 面向对象 - 构造方法(constructor)和 方法(methods)
- 面向对象 - private 和 protected 的异同
- 面向对象 - 成员可见性public 和 private (默认是public,可省略public 关键字)
继承与多态
// 模板
class Person {
// 定义了两个属性
firstName: string;
lastName: string;
greet() {
console.log('hi');
}
othergreet() {
this.greet();
console.log('*****');
}
}
// 继承成了父类的数据和行为,就是属性和方法
// 它的父类就是 Person
class Programmer extends Person {
greet() {
console.log('hello world');
}
// super 代表父类
greetLikeNormalPeople() {
super.greet();
}
}
let aProgrammer: Person = new Programmer();
// let aProgrammer: Programmer = new Person();
// 调用方法时,先找自己本身对象的方法,如果没有,会找父类的
// aProgrammer.greet();
// aProgrammer.greetLikeNormalPeople();
aProgrammer.othergreet();
public / protected / private
三个修饰符对成员属性和方法进行修饰
权限范围 public > protected > private
public 公有的(默认是 public,只是省略了)
- 任何属性和方法都可以在生成的对象中调用;
- 继承的对象也能调用
-
private 私有的
只有在内部对象内才能访问,实例的对象调用不了;
- 要调用私有方法和属性,可以在 class 里定义 public 的方法来调用
- 继承的对象也是不能够直接用生成的对象来访问
- 子类继承的时候也可以继承私有属性和方法,也是要通过继承过来的 public 方法来调用
protected 受保护的,只有在内部 class 还有子类才能访问,生成的对象访问不了,
要调用私有方法和属性,可以在 class 里定义 public 的方法来调用
继承的对象也是不能够直接用生成的对象来访问
子类继承的时候也可以继承保护的属性和方法,也是要通过继承过来的 public 方法和自己定义的public方法来在外部调用(这点跟其他的语言有些不太一样)
外部调用:生成对象的时候
内部调用:class 里面的方法
private protected异别: 在子类的时候
- 继承的方法一样的表现形式,可以内部访问继承过来的 public private protected 属性和方法
- 子类定义的方法,只能访问 继承过来的 public 和 protected 的方法和属性,不能访问 继承过来的 private 属性和方法,如果要访问父类的 private 属性和方法,可以通过继承过来的public private protected方法在内部来访问
常见问题
为什么有var还要使用let?
- 限制变量的作用范围(使用 let 来定义变量)
- 防止变量的重复定义(相同类型)
if(true){
var i = 100;
}
// 在函数里使用var定义i,函数外仍可以使用i
console.log(i); // 100