一、类与继承
-
使用
class可以定义对象的模板。 -
构造函数
constructor用于初始化类的属性。 -
子类使用
extends关键字继承父类。 -
子类可以调用
super()访问父类构造器,也可以重写父类方法。
示例:
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
sayHello() {
console.log(`Hello, I am ${this.name}`);
}
}
class Student extends Person {
grade: number;
constructor(name: string, grade: number) {
super(name);
this.grade = grade;
}
sayHello() {
console.log(`Hi, I'm ${this.name}, in grade ${this.grade}`);
}
}
二、属性修饰符:public、protected、private、readonly
-
public:默认值,任何地方都可以访问。 -
protected:只能在类和其子类中访问。 -
private:只能在类内部访问。 -
readonly:只读属性,初始化后不能修改。
示例:
class Animal {
public name: string;
protected age: number;
private id: string;
readonly species: string = "dog";
constructor(name: string, age: number, id: string) {
this.name = name;
this.age = age;
this.id = id;
}
}
class Dog extends Animal {
constructor(name: string, age: number, id: string) {
super(name, age, id);
console.log(this.age); // ✅ 访问 protected
// console.log(this.id); // ❌ 不能访问 private
}
}
三、抽象类(abstract)
-
抽象类不能被实例化,只能被继承。
-
可以包含抽象方法(无实现),子类必须实现。
-
可用于统一接口、规范结构。
示例:
abstract class Package {
abstract calculatePrice(): number;
printLabel() {
console.log("Shipping label...");
}
}
class ExpressPackage extends Package {
calculatePrice(): number {
return 25.5;
}
}
四、接口(interface)
-
用于定义对象结构、函数签名、类的契约。
-
可以继承多个接口。
-
类可通过
implements实现接口。
示例:
interface User {
name: string;
age: number;
}
interface Login {
login(username: string, password: string): boolean;
}
class Admin implements User, Login {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
login(username: string, password: string): boolean {
return username === this.name && password === "123";
}
}
五、类型别名(type)与接口的区别
-
type更适合联合类型、交叉类型、元组、条件类型等高级类型表达。 -
interface更适合结构性定义和类的继承。 -
interface支持声明合并,type不支持。
示例:
type Result = "success" | "fail"; // 联合类型
type Position = { x: number } & { y: number }; // 交叉类型
interface Point {
x: number;
y: number;
}
interface Point {
z: number;
}
// 合并后是 { x: number; y: number; z: number }
六、泛型(<T>)
-
提高代码灵活性和复用性。
-
可用于函数、接口、类。
-
调用时传入具体类型。
示例:泛型函数
function identity<T>(value: T): T {
return value;
}
identity<string>("hello");
identity<number>(123);
示例:泛型接口
interface ApiResponse<T> {
data: T;
code: number;
message: string;
}
const res: ApiResponse<string> = {
data: "ok",
code: 200,
message: "success"
};
示例:泛型类
class Container<T> {
private value: T;
constructor(value: T) {
this.value = value;
}
get(): T {
return this.value;
}
}
const stringBox = new Container<string>("hello");
七、类型声明文件(.d.ts)
-
用于为 JavaScript 库提供类型提示。
-
帮助 TypeScript 编译器检查类型。
-
通常用于第三方库(如 jQuery)中。
示例:声明函数类型
declare function greet(name: string): void;
greet("Tom"); // 编译器能识别类型
总结要点
| 特性 | 类型别名 type | 接口 interface |
|---|---|---|
| 可用于对象结构 | ✅ | ✅ |
| 可用于联合、交叉类型 | ✅ | ❌ |
| 支持声明合并 | ❌ | ✅ |
| 类的实现使用 | 一般不推荐 | ✅ class implements Interface |
| 更适用场景 | 高级类型、函数、元组、条件类型 | 面向对象、类结构化、扩展型设计 |