TypeScript 学习指南
目录
基础类型
基本类型
typescript
// 布尔值
let isDone: boolean = false;
// 数字
let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;
// 字符串
let color: string = "blue";
let fullName: string = `Bob ${lastName}`;
// 空值
let unusable: void = undefined;
let u: undefined = undefined;
let n: null = null;
// 符号
let sym: symbol = Symbol("key");说明:
- 类型注解
- 类型推断
- 类型检查
- 类型安全
数组和元组
typescript
// 数组
let list: number[] = [1, 2, 3];
let list2: Array<number> = [1, 2, 3];
// 元组
let tuple: [string, number] = ["hello", 10];
tuple[0] = "world";
tuple[1] = 20;
// 只读数组
let readonlyArray: ReadonlyArray<number> = [1, 2, 3];说明:
- 数组类型
- 元组类型
- 只读数组
- 类型安全
枚举
typescript
// 数字枚举
enum Direction {
Up = 1,
Down,
Left,
Right
}
// 字符串枚举
enum StringEnum {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT"
}
// 常量枚举
const enum ConstEnum {
Up,
Down,
Left,
Right
}说明:
- 数字枚举
- 字符串枚举
- 常量枚举
- 反向映射
Any 和 Unknown
typescript
// any 类型
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false;
// unknown 类型
let value: unknown = 4;
value = "maybe a string instead";
value = false;
// 类型断言
let someValue: unknown = "this is a string";
let strLength: number = (someValue as string).length;说明:
- any 类型
- unknown 类型
- 类型断言
- 类型安全
接口和类型
接口定义
typescript
// 基本接口
interface User {
name: string;
age: number;
email?: string;
readonly id: number;
}
// 函数类型接口
interface SearchFunc {
(source: string, subString: string): boolean;
}
// 可索引接口
interface StringArray {
[index: number]: string;
}
// 类类型接口
interface ClockInterface {
currentTime: Date;
setTime(d: Date): void;
}说明:
- 接口定义
- 可选属性
- 只读属性
- 函数类型
- 可索引类型
- 类类型
类型别名
typescript
// 基本类型别名
type Name = string;
type NameResolver = () => string;
type NameOrResolver = Name | NameResolver;
// 联合类型
type StringOrNumber = string | number;
// 交叉类型
type Combined = { a: number } & { b: string };
// 映射类型
type Readonly<T> = {
readonly [P in keyof T]: T[P];
};说明:
- 类型别名
- 联合类型
- 交叉类型
- 映射类型
联合类型
typescript
// 基本联合类型
let value: string | number;
value = "hello";
value = 42;
// 字面量联合类型
type Direction = "up" | "down" | "left" | "right";
// 对象联合类型
type Shape =
| { kind: "circle"; radius: number }
| { kind: "square"; size: number }
| { kind: "rectangle"; width: number; height: number };说明:
- 基本联合类型
- 字面量联合类型
- 对象联合类型
- 类型守卫
交叉类型
typescript
// 基本交叉类型
type Combined = { a: number } & { b: string };
// 对象交叉类型
type Person = {
name: string;
age: number;
};
type Employee = {
id: number;
department: string;
};
type EmployeePerson = Person & Employee;说明:
- 基本交叉类型
- 对象交叉类型
- 类型合并
- 类型冲突
函数
函数类型
typescript
// 函数类型声明
function add(x: number, y: number): number {
return x + y;
}
// 函数类型表达式
let myAdd: (x: number, y: number) => number = function(x: number, y: number): number {
return x + y;
};
// 函数类型接口
interface SearchFunc {
(source: string, subString: string): boolean;
}说明:
- 函数类型声明
- 函数类型表达式
- 函数类型接口
- 返回类型
函数重载
typescript
// 函数重载
function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string {
if (typeof x === "number") {
return Number(x.toString().split("").reverse().join(""));
} else {
return x.split("").reverse().join("");
}
}说明:
- 函数重载
- 重载签名
- 实现签名
- 类型检查
可选参数
typescript
// 可选参数
function buildName(firstName: string, lastName?: string) {
if (lastName) {
return firstName + " " + lastName;
} else {
return firstName;
}
}
// 默认参数
function buildName2(firstName: string, lastName: string = "Smith") {
return firstName + " " + lastName;
}说明:
- 可选参数
- 默认参数
- 参数顺序
- 类型安全
剩余参数
typescript
// 剩余参数
function sum(...numbers: number[]): number {
return numbers.reduce((a, b) => a + b, 0);
}
// 参数解构
function sum2({ a, b, c }: { a: number; b: number; c: number }): number {
return a + b + c;
}说明:
- 剩余参数
- 参数解构
- 类型安全
- 使用场景
泛型
泛型函数
typescript
// 基本泛型函数
function identity<T>(arg: T): T {
return arg;
}
// 泛型类型变量
function loggingIdentity<T>(arg: T[]): T[] {
console.log(arg.length);
return arg;
}
// 泛型约束
function getProperty<T, K extends keyof T>(obj: T, key: K) {
return obj[key];
}说明:
- 泛型函数
- 泛型类型变量
- 泛型约束
- 类型安全
泛型接口
typescript
// 基本泛型接口
interface GenericIdentityFn<T> {
(arg: T): T;
}
// 泛型类接口
interface GenericNumber<T> {
zeroValue: T;
add: (x: T, y: T) => T;
}
// 泛型约束接口
interface Lengthwise {
length: number;
}
function loggingIdentity<T extends Lengthwise>(arg: T): T {
console.log(arg.length);
return arg;
}说明:
- 泛型接口
- 泛型类接口
- 泛型约束接口
- 类型安全
泛型类
typescript
// 基本泛型类
class GenericNumber<T> {
zeroValue: T;
add: (x: T, y: T) => T;
}
// 泛型约束类
class Lengthwise<T extends Lengthwise> {
length: number;
add(x: T): T {
return x;
}
}说明:
- 泛型类
- 泛型约束类
- 类型安全
- 使用场景
泛型约束
typescript
// 基本约束
interface Lengthwise {
length: number;
}
function loggingIdentity<T extends Lengthwise>(arg: T): T {
console.log(arg.length);
return arg;
}
// 多重约束
interface A {
a: number;
}
interface B {
b: string;
}
function multipleConstraints<T extends A & B>(arg: T): T {
console.log(arg.a, arg.b);
return arg;
}说明:
- 基本约束
- 多重约束
- 类型安全
- 使用场景
高级类型
映射类型
typescript
// 基本映射类型
type Readonly<T> = {
readonly [P in keyof T]: T[P];
};
type Partial<T> = {
[P in keyof T]?: T[P];
};
// 条件映射类型
type NonNullable<T> = T extends null | undefined ? never : T;
// 递归映射类型
type DeepReadonly<T> = {
readonly [P in keyof T]: DeepReadonly<T[P]>;
};说明:
- 基本映射类型
- 条件映射类型
- 递归映射类型
- 使用场景
条件类型
typescript
// 基本条件类型
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 ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;说明:
- 基本条件类型
- 分布式条件类型
- 条件类型中的推断
- 使用场景
索引类型
typescript
// 基本索引类型
type Person = {
name: string;
age: number;
};
type PersonKeys = keyof Person; // "name" | "age"
// 索引访问类型
type NameType = Person["name"]; // string
// 映射索引类型
type ReadonlyPerson = {
readonly [K in keyof Person]: Person[K];
};说明:
- 基本索引类型
- 索引访问类型
- 映射索引类型
- 使用场景
工具类型
typescript
// 内置工具类型
type Readonly<T> = {
readonly [P in keyof T]: T[P];
};
type Partial<T> = {
[P in keyof T]?: T[P];
};
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
type Record<K extends keyof any, T> = {
[P in K]: T;
};
// 自定义工具类型
type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};说明:
- 内置工具类型
- 自定义工具类型
- 类型安全
- 使用场景
最佳实践
1. 类型定义
- 使用接口定义对象类型
- 使用类型别名定义联合类型
- 使用泛型提高代码复用性
- 避免使用 any 类型
2. 代码组织
- 使用模块化组织代码
- 使用命名空间组织相关类型
- 使用类型声明文件
- 遵循命名规范
3. 开发技巧
- 使用类型推断
- 使用类型守卫
- 使用类型断言
- 使用类型工具
学习资源
官方文档
视频课程
- 慕课网
- 极客时间
- B站技术区
- YouTube 技术频道