类与 OOP
classes、abstract、inheritance、access modifiers。
35 分钟
类与 OOP
TypeScript 的类在 JavaScript class 语法上增加了 访问修饰符、抽象类、implements、readonly 等类型能力。本课系统讲解 OOP 建模,为 nestjs-essentials 的 Controller/Service 分层与 nextjs-essentials 中少量 class-based 工具(如 Error 子类)打基础,并衔接 typescript-essentials 的接口知识。
学习目标
- 使用 public/private/protected/readonly 控制成员可见性
- 用 abstract class 定义可扩展基类
- 理解 implements 与 extends 的分工
基本类与修饰符
class TrackService {
readonly apiBase: string;
constructor(apiBase: string) {
this.apiBase = apiBase;
}
public async list(): Promise<Track[]> {
return this.fetchAll();
}
private async fetchAll(): Promise<Track[]> {
const res = await fetch(`${this.apiBase}/tracks`);
return res.json();
}
protected log(message: string): void {
console.log(`[TrackService] ${message}`);
}
}
interface Track {
slug: string;
title: string;
}
继承与 super
class CachedTrackService extends TrackService {
private cache = new Map<string, Track>();
override async list(): Promise<Track[]> {
if (this.cache.size > 0) {
return [...this.cache.values()];
}
const tracks = await super.list();
tracks.forEach((t) => this.cache.set(t.slug, t));
return tracks;
}
}
抽象类
abstract class Repository<T extends { id: number }> {
abstract findById(id: number): Promise<T | null>;
abstract save(entity: T): Promise<T>;
async exists(id: number): Promise<boolean> {
const found = await this.findById(id);
return found !== null;
}
}
class LessonRepository extends Repository<Lesson> {
async findById(id: number): Promise<Lesson | null> {
return null;
}
async save(entity: Lesson): Promise<Lesson> {
return entity;
}
}
interface Lesson {
id: number;
title: string;
}
implements 接口
interface Logger {
info(message: string): void;
error(message: string, err?: unknown): void;
}
class ConsoleLogger implements Logger {
info(message: string): void {
console.log(message);
}
error(message: string, err?: unknown): void {
console.error(message, err);
}
}