let : 区块定义,解决var 声明中带来的作用域混淆问题
const : 声明常量,不可改变
数字: number
布尔: boolean
字符串: string
数组: array
元组: tupple 是一个特殊的数组,是固定长度,固定类型的数组,声明元组的时候一定要指明类型,(bug: 使用push() 可以突破元组的界限,无限给元组添加长度)
联合union :表示取值可以为多种类型中的一种。
例:let myFoavorite:string | number;
字面量:literal
枚举: enum
任意: any
unknow: (不保证类型,但能保证类型安全)
viod: 函数在没有任何返回的情况,就是一个viod类型
undefined : 未经初始化的值
never : 大部分用来处理异常
类型适配: <> 或者 as
函数定义:
function add(arg1: number, arg2: number): number { return x + y; }
const add = (arg1: number, arg2: number): number => { return x + y; }
函数定义可选参数:可选参数只需在参数名后跟随一个?
即可
function add(arg1: number, arg2?: number): number { return x + y; }
const add = (arg1: number, arg2?: number): number => { return x + y; }
注意: 可选参数必须放在必选参数后面
默认参数:
const counter = (step = 1) => { count += step; };
剩余参数
const handleData = (arg1: number, ...args:number[]) => { console.log(args); };
handleData(1, 2, 3, 4, 5); // [ 2, 3, 4, 5 ]
(以{}包括起来,用键值对的形式显示)
const person= {
name: "张三",
lastName: "刘",
age: 18
}
例:
- interface Person {
- name: string,
- age: number,
- gender?: string | number // 用 ? 表示可有可无的属性
- }
定义: class 关键字定义类 。 constructor 定义构造函数
继承:
extends
关键字实现继承例:
- class Animal {
- public name: string;
- constructor(name: string) {
- this.name = name;
- }
- sayHi(): string {
- return `My name is ${this.name}`;
- }
- }
-
- class Cat extends Animal {
- constructor(name) {
- super(name); // 调用父类的 constructor(name)
- console.log(this.name);
- }
- sayHi(): string { // 将子类共用的方法抽象出来放在父类中,自己特殊逻辑放在子类中重写父类的逻辑
- return 'Meow, ' + super.sayHi(); // 调用父类的 sayHi()
- }
- }
-
- let c = new Cat('Tom'); // Tom
- console.log(c.sayHi()); // Meow, My name is Tom
重写(override) vs 重载 (overload)
重写:是指子类重写继承自父类的方法
重载: 是指为同一个函数提供多个类型定义
继承 VS 多态
继承: 子类继承父类,子类除了拥有父类的所有特性外,还有一些具体的特性
多态: 由继承而产生了相关的不同的类,对同一个方法可以有不同的行为
类的修饰符(默认public)
public : 公有
protected : 受保护的, 自己和自己的子类可以访问,其它类不可访问
private : 私有
当构造函数 使用 protected 时,该类只允许被继承
当构造函数 使用 private 时,该类不允许被继承或者实例化。
readonly
readonly 修饰的变量只能在属性声明时或 构造函数
中初始化
存取器
我们可以通过 getter
/ setter
来改变一个类中属性的读取和赋值行为
例:
- class Person {
- name: string
- constructor(name: string) {
- this.name = name
- }
- get getName() { // 读取
- return this.name
- }
- set setName(val: string) { // 赋值
- this.name = val.toUpperCase()
- }
- }
- let p1 = new Person('nihao')
- console.log(p1.getName)
- p1.setName = 'hello'
- console.log(p1.name)
静态属性和静态方法 static
不需要初始化,而是使用类直接调用
例:
- class Father {
- public name: string
- constructor(name: string) {
- this.name = name
- }
- public static className: string = 'Father'
- static getClassName(): string {
- return Father.className
- }
-
- }
- console.log(Father.className)
- console.log(Father.getClassName())
抽象类 (无法创建实例,只能被继承。使用 abstract 标记)
例:
(注: 在变量名后加 ! 表示: 该变量可以为null 或者 undefined)
- abstract class Animal {
- name!: string
- abstact speak(): void
- }
-
- class Cat extends Animal {
- speak(){
- console.log(123)
- }
- }
-
- let animal = new Animal() // ERROR 无法创建抽象类的实例
- let cat = new Cat()
- cat.speak() // 123
抽象方法
例:
- abstract class Animal {
- name: string
- abstract speak(): void = () => {} // ERROR 方法speak 不能具有实现,因为它被标记为 抽象
- }
- class Cat extends Animal {
- speak () { //在这里实现抽象方法
- console.log(123456)
- }
- }
-
-
- class Dog extends Animal {
- speak () {
- console.log("88995")
- }
- }