TypeScript 编程语言学习指南
TypeScript 是 JavaScript 的超集,添加了静态类型检查和面向对象编程特性。
目录
基础类型
基本数据类型
// 数字
let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;
let big: bigint = 100n;
// 字符串
let color: string = "blue";
let fullName: string = `Bob Bobbington`;
let age: number = 37;
let sentence: string = `Hello, my name is ${fullName}.`;
// 布尔值
let isDone: boolean = false;
// 数组
let list: number[] = [1, 2, 3];
let list2: Array<number> = [1, 2, 3];
// 元组
let tuple: [string, number] = ["hello", 10];
// 枚举
enum Color {
Red,
Green,
Blue,
}
let c: Color = Color.Green;
// 字符串枚举
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
}
// Any 类型
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false;
// Unknown 类型(更安全的 any)
let uncertain: unknown = 4;
uncertain = "hello";
uncertain = false;
// Void 类型
function warnUser(): void {
console.log("This is my warning message");
}
// Null 和 Undefined
let u: undefined = undefined;
let n: null = null;
// Never 类型
function error(message: string): never {
throw new Error(message);
}
function infiniteLoop(): never {
while (true) {}
}
// Object 类型
let obj: object = { name: "张三" };类型断言
// 类型断言
let someValue: unknown = "this is a string";
let strLength: number = (someValue as string).length;
// 另一种语法
let strLength2: number = (<string>someValue).length;
// 非空断言
function liveDangerously(x?: number | null) {
console.log(x!.toFixed()); // 断言 x 不为 null 或 undefined
}联合类型和交叉类型
// 联合类型
let value: string | number = "hello";
value = 42;
// 联合类型函数
function formatValue(value: string | number): string {
if (typeof value === "string") {
return value.toUpperCase();
} else {
return value.toFixed(2);
}
}
// 交叉类型
interface Person {
name: string;
age: number;
}
interface Employee {
id: number;
department: string;
}
type EmployeePerson = Person & Employee;
let employee: EmployeePerson = {
name: "张三",
age: 30,
id: 12345,
department: "技术部"
};接口
基本接口
interface User {
readonly id: number;
name: string;
age?: number; // 可选属性
email: string;
}
// 实现接口
const user: User = {
id: 1,
name: "张三",
email: "zhangsan@example.com"
};
// 函数接口
interface SearchFunc {
(source: string, subString: string): boolean;
}
let mySearch: SearchFunc = function(source: string, subString: string) {
let result = source.search(subString);
return result > -1;
};可索引接口
// 数组接口
interface StringArray {
[index: number]: string;
}
let myArray: StringArray = ["Bob", "Fred"];
// 对象接口
interface Dictionary {
[key: string]: string;
}
let myDict: Dictionary = {
"name": "张三",
"city": "北京"
};接口继承
interface Shape {
color: string;
}
interface Square extends Shape {
sideLength: number;
}
interface Circle extends Shape {
radius: number;
}
// 多重继承
interface ColoredSquare extends Square, Circle {
borderWidth: number;
}
let square = <ColoredSquare>{};
square.color = "blue";
square.sideLength = 10;
square.radius = 5;
square.borderWidth = 2;类
基本类
class Animal {
private name: string;
protected species: string;
constructor(name: string, species: string) {
this.name = name;
this.species = species;
}
public makeSound(): void {
console.log("Some sound");
}
protected getInfo(): string {
return `${this.name} is a ${this.species}`;
}
}
class Dog extends Animal {
constructor(name: string) {
super(name, "Canis");
}
public makeSound(): void {
console.log("Woof!");
}
public getDogInfo(): string {
return this.getInfo(); // 可以访问 protected 方法
}
}抽象类
abstract class Vehicle {
abstract startEngine(): void;
public stopEngine(): void {
console.log("Engine stopped");
}
}
class Car extends Vehicle {
startEngine(): void {
console.log("Car engine started");
}
}
class Motorcycle extends Vehicle {
startEngine(): void {
console.log("Motorcycle engine started");
}
}访问修饰符
class Example {
public publicField: string = "public"; // 公共
private privateField: string = "private"; // 私有
protected protectedField: string = "protected"; // 受保护
readonly readonlyField: string = "readonly"; // 只读
constructor(
public param1: string, // 参数属性
private param2: number
) {}
}泛型
基本泛型
// 泛型函数
function identity<T>(arg: T): T {
return arg;
}
let output1 = identity<string>("myString");
let output2 = identity("myString"); // 类型推断
// 泛型接口
interface GenericIdentityFn<T> {
(arg: T): T;
}
let myIdentity: GenericIdentityFn<number> = identity;
// 泛型类
class GenericNumber<T> {
zeroValue: T;
add: (x: T, y: T) => T;
}
let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };泛型约束
// 接口约束
interface Lengthwise {
length: number;
}
function loggingIdentity<T extends Lengthwise>(arg: T): T {
console.log(arg.length);
return arg;
}
// 类约束
class BeeKeeper {
hasMask: boolean = true;
}
class ZooKeeper {
nametag: string = "Mikle";
}
class Animal {
numLegs: number = 4;
}
class Bee extends Animal {
keeper: BeeKeeper = new BeeKeeper();
}
class Lion extends Animal {
keeper: ZooKeeper = new ZooKeeper();
}
function createInstance<A extends Animal>(c: new () => A): A {
return new c();
}
createInstance(Lion).keeper.nametag;
createInstance(Bee).keeper.hasMask;高级泛型
// 条件类型
type NonNullable<T> = T extends null | undefined ? never : T;
// 映射类型
type Readonly<T> = {
readonly [P in keyof T]: T[P];
};
type Partial<T> = {
[P in keyof T]?: T[P];
};
// 实用工具类型
interface Person {
name: string;
age: number;
address: string;
}
type PersonReadonly = Readonly<Person>;
type PersonPartial = Partial<Person>;
type PersonKeys = keyof Person; // "name" | "age" | "address"高级类型
条件类型
// 基本条件类型
type TypeName<T> = T extends string ? "string" :
T extends number ? "number" :
T extends boolean ? "boolean" :
T extends undefined ? "undefined" :
T extends Function ? "function" : "object";
// 分布式条件类型
type ToArray<T> = T extends any ? T[] : never;
type StrNumOrBool = ToArray<string | number | boolean>; // string[] | number[] | boolean[]
// 条件类型中的推断
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
// 多个条件分支
type Unpacked<T> = T extends (infer U)[] ? U :
T extends (...args: any[]) => infer U ? U :
T extends Promise<infer U> ? U : T;映射类型
// 基本映射类型
type Readonly<T> = {
readonly [P in keyof T]: T[P];
};
type Mutable<T> = {
-readonly [P in keyof T]: T[P];
};
type Optional<T> = {
[P in keyof T]?: T[P];
};
type Required<T> = {
[P in keyof T]-?: T[P];
};
// 键的重新映射
type Getters<T> = {
[P in keyof T as `get${Capitalize<string & P>}`]: () => T[P];
};
interface Person {
name: string;
age: number;
}
type PersonGetters = Getters<Person>; // { getName: () => string; getAge: () => number; }模板字面量类型
type EmailLocaleIDs = "welcome_email" | "email_heading";
type FooterLocaleIDs = "footer_title" | "footer_sendoff";
type AllLocaleIDs = `${EmailLocaleIDs | FooterLocaleIDs}_id`;
// 字符串操作类型
type Uppercase<S extends string> = S extends string ? Uppercase<S> : never;
type Lowercase<S extends string> = S extends string ? Lowercase<S> : never;
type Capitalize<S extends string> = S extends string ? Capitalize<S> : never;
type Uncapitalize<S extends string> = S extends string ? Uncapitalize<S> : never;
// 字符串模板类型
type EventName<T extends string> = `${T}Changed`;
type Concat<S1 extends string, S2 extends string> = `${S1}${S2}`;模块和命名空间
模块
// math.ts
export interface Calculator {
add(a: number, b: number): number;
subtract(a: number, b: number): number;
}
export class BasicCalculator implements Calculator {
add(a: number, b: number): number {
return a + b;
}
subtract(a: number, b: number): number {
return a - b;
}
}
export default class AdvancedCalculator extends BasicCalculator {
multiply(a: number, b: number): number {
return a * b;
}
}
// main.ts
import AdvancedCalculator, { Calculator, BasicCalculator } from './math';
const calc: Calculator = new AdvancedCalculator();
console.log(calc.add(5, 3));命名空间
namespace Validation {
export interface StringValidator {
isValid(s: string): boolean;
}
const lettersRegexp = /^[A-Za-z]+$/;
const numberRegexp = /^[0-9]+$/;
export class LettersOnlyValidator implements StringValidator {
isValid(s: string) {
return lettersRegexp.test(s);
}
}
export class ZipCodeValidator implements StringValidator {
isValid(s: string) {
return s.length === 5 && numberRegexp.test(s);
}
}
}
// 使用
let validators: { [s: string]: Validation.StringValidator; } = {};
validators["ZIP code"] = new Validation.ZipCodeValidator();
validators["Letters only"] = new Validation.LettersOnlyValidator();装饰器
类装饰器
// 类装饰器
function sealed(constructor: Function) {
Object.seal(constructor);
Object.seal(constructor.prototype);
}
@sealed
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
// 装饰器工厂
function color(value: string) {
return function (target: Function) {
// 做一些元数据相关的操作
};
}
@color("red")
class Car {}方法装饰器
// 方法装饰器
function log(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const method = descriptor.value;
descriptor.value = function (...args: any[]) {
console.log(`调用方法: ${propertyKey}`);
const result = method.apply(this, args);
console.log(`方法 ${propertyKey} 执行完成`);
return result;
};
}
class Calculator {
@log
add(a: number, b: number): number {
return a + b;
}
}属性装饰器
// 属性装饰器
function format(formatString: string) {
return function (target: any, propertyKey: string) {
let value = target[propertyKey];
const getter = function() {
return value;
};
const setter = function(newVal: string) {
value = formatString.replace('{0}', newVal);
};
Object.defineProperty(target, propertyKey, {
get: getter,
set: setter,
enumerable: true,
configurable: true
});
};
}
class Greeter {
@format("Hello, {0}!")
greeting: string;
}最佳实践
类型安全
// 避免使用 any
// 不好的做法
function processData(data: any): any {
return data.someProperty;
}
// 好的做法
interface Data {
someProperty: string;
}
function processData(data: Data): string {
return data.someProperty;
}
// 使用类型守卫
function isString(value: unknown): value is string {
return typeof value === 'string';
}
function processValue(value: unknown): string {
if (isString(value)) {
return value.toUpperCase(); // TypeScript 知道这里是 string
}
throw new Error('Value is not a string');
}错误处理
// 自定义错误类型
class ValidationError extends Error {
constructor(
message: string,
public field: string,
public value: any
) {
super(message);
this.name = 'ValidationError';
}
}
// 使用 Result 类型
type Result<T, E = Error> =
| { success: true; data: T }
| { success: false; error: E };
function divide(a: number, b: number): Result<number, string> {
if (b === 0) {
return { success: false, error: "除数不能为零" };
}
return { success: true, data: a / b };
}性能优化
// 使用 const assertions
const colors = ['red', 'green', 'blue'] as const;
type Color = typeof colors[number]; // 'red' | 'green' | 'blue'
// 使用 satisfies 操作符
const config = {
apiUrl: 'https://api.example.com',
timeout: 5000,
retries: 3
} satisfies {
apiUrl: string;
timeout: number;
retries: number;
};
// 类型推断
type Config = typeof config;配置和工具
tsconfig.json
{
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"moduleResolution": "node",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
"declaration": true,
"declarationMap": true,
"sourceMap": true,
"outDir": "./dist",
"rootDir": "./src"
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}与 React 集成
// 组件类型
interface Props {
name: string;
age?: number;
onNameChange: (name: string) => void;
}
const UserProfile: React.FC<Props> = ({ name, age, onNameChange }) => {
return (
<div>
<h1>{name}</h1>
{age && <p>Age: {age}</p>}
<button onClick={() => onNameChange('New Name')}>
Change Name
</button>
</div>
);
};
// Hook 类型
function useCounter(initialValue: number = 0) {
const [count, setCount] = useState(initialValue);
const increment = useCallback(() => {
setCount(prev => prev + 1);
}, []);
const decrement = useCallback(() => {
setCount(prev => prev - 1);
}, []);
return { count, increment, decrement };
}与 Node.js 集成
// Express 应用类型
import express, { Request, Response, NextFunction } from 'express';
interface User {
id: number;
name: string;
email: string;
}
interface AuthenticatedRequest extends Request {
user?: User;
}
const app = express();
app.get('/api/users', (req: AuthenticatedRequest, res: Response) => {
if (!req.user) {
return res.status(401).json({ error: 'Unauthorized' });
}
res.json({ user: req.user });
});
// 中间件类型
const authMiddleware = (req: AuthenticatedRequest, res: Response, next: NextFunction) => {
const token = req.headers.authorization;
if (!token) {
return res.status(401).json({ error: 'No token provided' });
}
// 验证 token 并设置用户
req.user = { id: 1, name: '张三', email: 'zhangsan@example.com' };
next();
};学习资源
常用工具
- VS Code - 优秀的 TypeScript 支持
- ts-node - 直接运行 TypeScript 文件
- tsc - TypeScript 编译器
- ESLint + @typescript-eslint - 代码质量检查
- Prettier - 代码格式化
最后更新: 2024年
最近更新:12/9/2025, 2:17:57 AM