TypeScript 基础
TypeScript 是 JavaScript 的超集,提供了可选的静态类型和基于类的面向对象编程。
1. 基础类型
1.1 原始类型
// Boolean
let isDone: boolean = false;
// Number - 支持十进制、十六进制、二进制和八进制
let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;
// String - 支持 模板字符串
let color: string = "blue";
let sentence: string = `Color is ${color}`;
// Symbol
const sym: symbol = Symbol("key");
1.2 数组和元组
// 数组
let list1: number[] = [1, 2, 3];
let list2: Array<number> = [1, 2, 3];
// 元组 - 固定长度的数组,每个位置有特定的类型
let tuple: [string, number] = ["hello", 10];
1.3 特殊类型
// any - 任意类型,跳过类型检查
let notSure: any = 4;
notSure = "maybe a string";
notSure = false;
// unknown - 类型安全的any
let value: unknown = 4;
if (typeof value === "string") {
console.log(value.toUpperCase());
}
// void - 通常用于函数返回值
function warnUser(): void {
console.log("Warning message");
}
// never - 永不返回的函数
function error(message: string): never {
throw new Error(message);
}
// null 和 undefined
let u: undefined = undefined;
let n: null = null;
2. 接口和类型
2.1 接口
// 基本接口
interface Point {
x: number;
y: number;
readonly z?: number; // 可选且只读属性
}
// 函数接口
interface SearchFunc {
(source: string, subString: string): boolean;
}
// 类接口
interface ClockInterface {
currentTime: Date;
setTime(d: Date): void;
}
// 扩展接口
interface Shape {
color: string;
}
interface Square extends Shape {
sideLength: number;
}
2.2 类型别名
// 基本类型别名
type Name = string;
type NameResolver = () => string;
type NameOrResolver = Name | NameResolver;
// 字面量类型
type Direction = "North" | "South" | "East" | "West";
type DiceRoll = 1 | 2 | 3 | 4 | 5 | 6;
// 交叉类型
type Employee = Person & { employeeId: number };
3. 函数
3.1 函数类型
// 函数声明
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; };
// 可选参数和默认参数
function buildName(firstName: string, lastName?: string): string {
return lastName ? firstName + " " + lastName : firstName;
}
// 剩余参数
function buildList(items: string, ...restItems: string[]): string[] {
return [items, ...restItems];
}
3.2 函数重载
function padding(all: number): { top: number; right: number; bottom: number; left: number };
function padding(topAndBottom: number, leftAndRight: number): { top: number; right: number; bottom: number; left: number };
function padding(top: number, right: number, bottom: number, left: number): { top: number; right: number; bottom: number; left: number };
function padding(a: number, b?: number, c?: number, d?: number) {
if (b === undefined && c === undefined && d === undefined) {
b = c = d = a;
} else if (c === undefined && d === undefined) {
c = a;
d = b;
}
return {
top: a,
right: b,
bottom: c,
left: d
};
}
4. 类
4.1 基本类语法
class Animal {
// 属性
private name: string;
protected age: number;
readonly species: string;
// 构造函数
constructor(name: string, age: number, species: string) {
this.name = name;
this.age = age;
this.species = species;
}
// 方法
public makeSound(): void {
console.log("Some sound");
}
}
// 继承
class Dog extends Animal {
constructor(name: string, age: number) {
super(name, age, "Canine");
}
makeSound(): void {
console.log("Woof!");
}
}
4.2 访问修饰符
class Example {
public publicMember: string; // 可以在任何地方访问
private privateMember: string; // 只能在类内部访问
protected protectedMember: string; // 可以在类内部和子类中访问
readonly readonlyMember: string; // 只读属性
// 参数属性
constructor(public x: number, private y: number) {
// 自动创建并初始化x和y属性
}
}
5. 枚举
// 数字枚举
enum Direction {
Up = 1,
Down, // 2
Left, // 3
Right // 4
}
// 字符串枚举
enum Color {
Red = "RED",
Green = "GREEN",
Blue = "BLUE"
}
// 异构枚举
enum BooleanLikeHeterogeneousEnum {
No = 0,
Yes = "YES",
}
// 常量枚举
const enum Constants {
Max = 100,
Min = 0
}
6. 类型断言
// 尖括号语法
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;
// as 语法
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;
// 非空断言
function liveDangerously(x?: number | null) {
// x! 表示x一定不为null或undefined
console.log(x!.toFixed());
}