跳到主要内容

TypeScript 速查表

快速查阅 TypeScript 常用语法和类型。

基本类型

// 基本类型
let str: string = "hello";
let num: number = 123;
let bool: boolean = true;

// 数组
let arr1: number[] = [1, 2, 3];
let arr2: Array<string> = ["a", "b", "c"];

// 元组
let tuple: [string, number] = ["hello", 123];

// 枚举
enum Color { Red, Green, Blue }
let color: Color = Color.Red;

// 特殊类型
let any: any = "anything";
let unknown: unknown = "value";
let void: void = undefined;
let never: never; // 永不返回
let null: null = null;
let undefined: undefined = undefined;

接口与类型别名

// 接口
interface User {
id: number;
name: string;
age?: number; // 可选属性
readonly email: string; // 只读属性
}

// 类型别名
type ID = string | number;
type Point = { x: number; y: number };
type Callback = (data: string) => void;

// 接口继承
interface Animal { name: string; }
interface Dog extends Animal { breed: string; }

// 交叉类型
type Person = Name & Age;

函数

// 函数类型
function add(a: number, b: number): number {
return a + b;
}

// 箭头函数
const multiply = (a: number, b: number): number => a * b;

// 可选参数与默认参数
function greet(name: string, greeting?: string): string
function greet(name: string, greeting: string = "Hello"): string

// 剩余参数
function sum(...numbers: number[]): number

// 函数重载
function convert(value: number): string;
function convert(value: string): number;
function convert(value: number | string): number | string

class Person {
// 属性
private name: string;
protected age: number;
public email: string;
readonly id: number;
static count: number = 0;

// 构造函数
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}

// 方法
greet(): string {
return `Hello, I'm ${this.name}`;
}

// Getter/Setter
get fullName(): string {
return this.name;
}

set fullName(value: string) {
this.name = value;
}
}

// 继承
class Employee extends Person {
constructor(name: string, age: number, private salary: number) {
super(name, age);
}
}

// 实现接口
interface Printable { print(): void; }
class Document implements Printable {
print() { console.log("打印"); }
}

泛型

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

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

// 泛型类
class Box<T> {
constructor(private value: T) {}
getValue(): T { return this.value; }
}

// 泛型约束
interface Lengthwise { length: number; }
function logLength<T extends Lengthwise>(arg: T): void

// 多类型参数
function pair<K, V>(key: K, value: V): [K, V]

// 默认类型
interface ApiResponse<T = any> { data: T; }

类型守卫

// typeof
if (typeof value === "string") { ... }

// instanceof
if (obj instanceof Date) { ... }

// in 操作符
if ("name" in obj) { ... }

// 自定义类型守卫
function isUser(obj: any): obj is User {
return "name" in obj && "email" in obj;
}

// 类型谓词
function isAdmin(user: User | Admin): user is Admin

工具类型

// Partial - 所有属性可选
type PartialUser = Partial<User>;

// Required - 所有属性必需
type RequiredUser = Required<User>;

// Readonly - 所有属性只读
type ReadonlyUser = Readonly<User>;

// Pick - 选取部分属性
type UserName = Pick<User, "name" | "email">;

// Omit - 排除部分属性
type UserWithoutId = Omit<User, "id">;

// Record - 创建对象类型
type UserMap = Record<string, User>;

// ReturnType - 获取返回类型
type Result = ReturnType<typeof func>;

// Parameters - 获取参数类型
type Params = Parameters<typeof func>;

// NonNullable - 排除 null 和 undefined
type NonNull = NonNullable<string | null | undefined>;

// Extract - 提取类型
type Strings = Extract<string | number, string>;

// Exclude - 排除类型
type Numbers = Exclude<string | number, string>;

条件类型

// 基本条件类型
type IsString<T> = T extends string ? true : false;

// infer 关键字
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never;
type Parameters<T> = T extends (...args: infer P) => any ? P : never;
type UnwrapPromise<T> = T extends Promise<infer U> ? U : T;

映射类型

// 基本映射
type Readonly<T> = { readonly [K in keyof T]: T[K] };
type Partial<T> = { [K in keyof T]?: T[K] };

// 键重映射
type Getters<T> = {
[K in keyof T as `get${Capitalize<string & K>}`]: () => T[K];
};

// 过滤属性
type StringProps<T> = {
[K in keyof T as T[K] extends string ? K : never]: T[K];
};

模板字面量类型

type EventName = `on${Capitalize<string>}`;
type Greeting = `hello ${string}`;

// 内置字符串工具类型
type Upper = Uppercase<"hello">; // "HELLO"
type Lower = Lowercase<"HELLO">; // "hello"
type Cap = Capitalize<"hello">; // "Hello"
type Uncap = Uncapitalize<"Hello">; // "hello"

声明文件

// 声明变量
declare const API_URL: string;
declare function fetch(url: string): Promise<Response>;

// 声明模块
declare module "my-library" {
export function doSomething(value: string): number;
export interface Config {
timeout: number;
}
}

// 声明全局类型
declare global {
interface Window {
myCustomProperty: string;
}
}

// 扩展模块
declare module "express" {
interface Request {
user?: User;
}
}

tsconfig.json 常用配置

{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"lib": ["ES2020"],
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"moduleResolution": "node",
"sourceMap": true,
"declaration": true
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}

常用操作符

操作符用途示例
|联合类型string | number
&交叉类型Name & Age
keyof获取键类型keyof User
typeof获取类型typeof obj
infer类型推断infer R
as类型断言value as string
!非空断言obj!.property
?.可选链obj?.property
??空值合并value ?? default

常见错误解决

// 对象字面量额外属性检查
const user: User = { name: "张三", extra: 1 } as User;

// 绕过只读检查
const arr: ReadonlyArray<number> = [1, 2, 3];
const mutable = arr as number[];

// 类型守卫避免错误
if (value && typeof value === "object") {
// value 是对象
}

// 类型断言解决不确定类型
const element = document.getElementById("app") as HTMLDivElement;