// 基本类型
let isDone: boolean = false;
let count: number = 42;
let username: string = "Alice";
// 数组
let list1: number[] = [1, 2, 3];
let list2: Array<number> = [1, 2, 3]; // 泛型语法
// 元组 - 固定数量和类型的数组
let x: [string, number];
x = ["hello", 10]; // ✅ 正确
// x = [10, "hello"]; // ❌ 错误
// 枚举
enum Color {
Red, // 0
Green, // 1
Blue // 2
}
let c: Color = Color.Green; // 值为 1
// 任意类型
let notSure: any = 4;
notSure = "maybe a string";
// 空值
function warnUser(): void {
console.log("This is a warning");
}
// Never 类型
function error(message: string): never {
throw new Error(message);
}
function infiniteLoop(): never {
while (true) {}
}
// Unknown 类型
let value: unknown;
value = "a string";
if (typeof value === "string") {
let str: string = value; // ✅ 类型收窄后安全
}
二、类型断言
typescript复制代码
let someValue: any = "this is a string";
// 尖括号语法
let strLength1: number = (<string>someValue).length;
// as 语法(推荐)
let strLength2: number = (someValue as string).length;
// 非空断言
let mayBeNull: string | null = "hello";
let guaranteed: string = mayBeNull!;
// 基本类型别名
type Point = {
x: number;
y: number;
};
// 联合类型
type ID = number | string;
// 交叉类型
type Named = { name: string };
type Aged = { age: number };
type Person = Named & Aged;
// 复杂类型
type StringOrNumber = string | number;
type Coordinates = [number, number];
type Callback<T> = (data: T) => void;
// 接口 vs 类型别名
interface Animal {
name: string;
}
type Bear = Animal & {
honey: boolean
};
五、泛型 (Generics)
泛型函数
typescript复制代码
function identity<T>(arg: T): T {
return arg;
}
let output1 = identity<string>("myString");
let output2 = identity("myString"); // 类型推断
// 泛型约束
interface Lengthwise {
length: number;
}
function loggingIdentity<T extends Lengthwise>(arg: T): T {
console.log(arg.length);
return arg;
}
// 多个类型参数
function swap<T, U>(tuple: [T, U]): [U, T] {
return [tuple[1], tuple[0]];
}
// 继承
class Dog extends Animal {
private breed: string;
constructor(name: string, age: number, breed: string) {
super(name, age);
this.breed = breed;
}
bark(): void {
console.log("Woof! Woof!");
console.log(this.age); // ✅ protected 可访问
}
}
// 抽象类
abstract class Department {
constructor(public name: string) {}
abstract printMeeting(): void; // 抽象方法
printName(): void {
console.log("Department name: " + this.name);
}
}
class AccountingDepartment extends Department {
constructor() {
super("Accounting and Auditing");
}
printMeeting(): void { // 必须实现抽象方法
console.log("The Accounting Department meets each Monday at 10am.");
}
}
七、函数
函数类型
typescript复制代码
// 函数声明
function add(x: number, y: number): number {
return x + y;
}
// 函数表达式
let myAdd: (x: number, y: number) => number = function(x, y) {
return x + y;
};
// 可选参数和默认参数
function buildName(firstName: string, lastName?: string, age: number = 18) {
if (lastName) {
return `${firstName} ${lastName}, age ${age}`;
}
return firstName;
}
// 剩余参数
function buildNames(firstName: string, ...restOfName: string[]) {
return firstName + " " + restOfName.join(" ");
}
// 函数重载
function makeDate(timestamp: number): Date;
function makeDate(year: number, month: number, day: number): Date;
function makeDate(yearOrTimestamp: number, month?: number, day?: number): Date {
if (month !== undefined && day !== undefined) {
return new Date(yearOrTimestamp, month, day);
} else {
return new Date(yearOrTimestamp);
}
}
八、高级类型
联合与交叉类型
typescript复制代码
// 联合类型
let padding: string | number;
// 类型守卫
function isString(x: any): x is string {
return typeof x === "string";
}
function processValue(value: string | number) {
if (isString(value)) {
return value.toUpperCase(); // 这里 value 是 string 类型
} else {
return value.toFixed(2); // 这里 value 是 number 类型
}
}
类型操作符
typescript复制代码
// keyof 操作符
interface Person {
name: string;
age: number;
location: string;
}
type PersonKeys = keyof Person; // "name" | "age" | "location"
// typeof 类型操作符
let s = "hello";
let n: typeof s; // string
// 索引访问类型
type NameType = Person["name"]; // string
type PersonPropTypes = Person[keyof Person]; // string | number
// 映射类型
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 Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
条件类型
typescript复制代码
// 基本条件类型
type TypeName<T> =
T extends string ? "string" :
T extends number ? "number" :
T extends boolean ? "boolean" :
"object";
// 分布式条件类型
type ToArray<T> = T extends any ? T[] : never;
type StrOrNumArray = ToArray<string | number>; // string[] | number[]
// 条件类型与 infer
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
type MyFunc = (x: number) => string;
type Result = ReturnType<MyFunc>; // string