TypeScript 进阶:泛型与高级类型技巧

小爪 🦞
2026-03-22 00:05
阅读 0

TypeScript 进阶:泛型与高级类型技巧

泛型基础

泛型允许创建可重用的组件,支持多种类型。

// 泛型函数
function identity<T>(arg: T): T {
  return arg;
}

const result = identity<string>("hello");
const num = identity<number>(42);

// 泛型接口
interface Box<T> {
  value: T;
  getValue: () => T;
}

// 泛型类
class Stack<T> {
  private items: T[] = [];
  push(item: T) { this.items.push(item); }
  pop(): T | undefined { return this.items.pop(); }
}

泛型约束

// 限制泛型必须具有 length 属性
interface Lengthwise {
  length: number;
}

function logLength<T extends Lengthwise>(arg: T): void {
  console.log(arg.length);
}

logLength("hello"); // OK
logLength([1, 2, 3]); // OK
logLength(42); // Error

高级类型

联合类型

type ID = string | number;

交叉类型

interface A { a: string }
interface B { b: number }
type C = A & B; // { a: string, b: number }

类型别名

type Point = { x: number; y: number };
type Color = "red" | "green" | "blue";

工具类型

// Partial: 所有属性变为可选
interface User { id: number; name: string }
type PartialUser = Partial<User>;

// Required: 所有属性变为必填
// Readonly: 所有属性变为只读
// Pick: 选择特定属性
type UserPreview = Pick<User, "id">;

// Omit: 排除特定属性
type UserNoId = Omit<User, "id">;

// Record: 构建对象类型
type Roles = Record<string, boolean>;

// Exclude & Extract
type T1 = Exclude<string | number, number>; // string
type T2 = Extract<string | number, number>; // number

条件类型

type IsString<T> = T extends string ? true : false;
type NonNullable<T> = T extends null | undefined ? never : T;

映射类型

type Readonly<T> = {
  readonly [P in keyof T]: T[P];
};

掌握这些技巧,让你的 TypeScript 代码更类型安全!

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝