深入浅出:TypeScript 笔记(二)
2023-09-14 09:25:40
好的,这里有一篇关于 typescript 笔记(二)的文章。
TypeScript 作为一种强大的 JavaScript 超集,拥有诸多实用特性,在实际开发中大放异彩。本文将继续深入探究 TypeScript 中一些常用功能,如类型断言、类型保护、枚举、接口、类、访问修饰符、构造函数、继承、多态、抽象类等,帮助你更全面地掌握 TypeScript。
类型断言
类型断言,顾名思义,就是断言一个变量的类型。它允许你显式地指定一个变量的类型,即使该变量的实际类型与指定类型不匹配。类型断言可以通过两种方式实现:
- 尖括号语法(<>):尖括号语法是最常用的类型断言方式。它通过在变量名后跟一个尖括号内的类型注解来实现。例如:
let str: string = "Hello TypeScript";
let num = <number> str; // 类型断言,将字符串转换为数字
console.log(num); // 输出结果:NaN
- as as 是另一种类型断言方式。它通过在变量名后跟一个 as 关键字和一个类型注解来实现。例如:
let str: string = "Hello TypeScript";
let num = str as number; // 类型断言,将字符串转换为数字
console.log(num); // 输出结果:NaN
需要注意的是,类型断言并不会改变变量的实际类型,它只是在编译时告诉编译器你希望将该变量视为指定类型。因此,在使用类型断言时,需要确保你对变量的类型有足够的了解,否则可能会导致意料之外的结果。
类型保护
类型保护是指在运行时检查一个变量的类型并采取相应措施的技术。TypeScript 提供了几种类型保护的方式:
- instanceof 操作符:instanceof 操作符用于检查一个对象是否属于某个类。例如:
class Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}
let person = new Person("John Doe", 30);
if (person instanceof Person) {
console.log("person is a Person object"); // 输出结果:person is a Person object
}
- typeof 操作符:typeof 操作符用于获取一个变量的类型。例如:
let str: string = "Hello TypeScript";
let num = 123;
console.log(typeof str); // 输出结果:string
console.log(typeof num); // 输出结果:number
- in 操作符:in 操作符用于检查一个属性是否属于某个对象。例如:
class Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}
let person = new Person("John Doe", 30);
if ("name" in person) {
console.log("person has a name property"); // 输出结果:person has a name property
}
枚举
枚举是一种将一组常量值组织成一个类型的机制。枚举类型可以用于限制变量只能取某一组值中的一个,从而提高代码的可读性和安全性。例如:
enum Color {
Red,
Green,
Blue
}
let color: Color = Color.Red;
switch (color) {
case Color.Red:
console.log("The color is red");
break;
case Color.Green:
console.log("The color is green");
break;
case Color.Blue:
console.log("The color is blue");
break;
}
接口
接口是一种定义对象结构的机制。它了对象应该具有的属性和方法,但并不实现这些属性和方法。接口可以用于对不同对象进行统一管理,从而提高代码的可读性和可维护性。例如:
interface Person {
name: string;
age: number;
greet(): void;
}
class Student implements Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
let student = new Student("John Doe", 30);
student.greet(); // 输出结果:Hello, my name is John Doe and I am 30 years old.
类
类是一种创建对象的蓝图。它定义了对象的属性和方法,以及对象的创建方式。类可以用于组织和管理代码,从而提高代码的可读性和可维护性。例如:
class Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
let person = new Person("John Doe", 30);
person.greet(); // 输出结果:Hello, my name is John Doe and I am 30 years old.
访问修饰符
访问修饰符用于控制类成员(属性和方法)的访问权限。TypeScript 提供了三种访问修饰符:
- public:public 访问修饰符表示类成员可以从任何地方访问。
- protected:protected 访问修饰符表示类成员只能从类本身和其子类访问。
- private:private 访问修饰符表示类成员只能从类本身访问。
例如:
class Person {
private name: string;
protected age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
public greet() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
class Student extends Person {
constructor(name: string, age: number) {
super(name, age);
}
public study() {
console.log("I am studying.");
}
}
let student = new Student("John Doe", 30);
student.greet(); // 输出结果:Hello, my name is John Doe and I am 30 years old.
student.study(); // 输出结果:I am studying.
构造函数
构造函数是一种特殊的方法,它会在创建对象时自动调用。构造函数用于初始化对象的属性和方法。例如:
class Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
let person = new Person("John Doe", 30);
person.greet(); // 输出结果:Hello, my name is John Doe and I am 30 years old.
继承
继承是一种创建新类(子类)的方法,该类从另一个类(父类)继承属性和方法。子类可以重写父类的属性和方法,也可以定义自己的属性和方法。例如:
class Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
class Student extends Person {
constructor(name: string, age: number) {
super(name, age);
}
study() {
console.log("I am studying.");
}
}
let student = new Student("John Doe", 30);
student.greet(); // 输出结果:Hello, my name is John Doe and I am