编程语言的类型系统是一套规则和约束,用于定义和检查程序中各种数据类型及其操作。它确保变量和表达式在程序执行时具有一致的类型,从而避免类型错误。类型系统可以分为静态类型和动态类型:静态类型在编译时进行类型检查,如 Java 和 C++;动态类型在运行时进行类型检查,如 Python 和 JavaScript。类型系统通过类型注解、类型推断、类型检查等机制,提供类型安全性、增强代码的可维护性和可读性,并帮助开发者在编译期发现潜在错误,减少运行时异常。
一、基础数据类型
- 布尔类型(boolean)
- 数字类型(number)
- 字符串类型(string)
- 数组类型(array)
- 元组类型(tuple)
- 枚举类型(enum)
- 任意类型(any)
- 空值类型(void)
- Null 和 Undefined
- Never 类型(never)
- 未知类型(unknown)
1.布尔类型(boolean)
布尔类型表示逻辑值:true 或 false。
let isDone: boolean = false;
2.数字类型(number)
数字类型用于表示整数和浮点数。
let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;
3.字符串类型(string)
字符串类型用于表示文本数据。可以使用双引号("
)、单引号('
)或模板字符串(`
)。
let color: string = "blue";
color = 'red';
let fullName: string = `John Doe`;
let age: number = 30;
let sentence: string = `Hello, my name is ${fullName}. I'll be ${age + 1} years old next month.`;
4.数组类型(array)
数组类型表示相同类型的一组数据。有两种方式定义数组:
let list: number[] = [1, 2, 3];
let list: Array<number> = [1, 2, 3];
5.元组类型(tuple)
元组类型用于表示一个已知元素数量和类型的数组。各元素的类型可以不同。
let x: [string, number];
x = ["hello", 10]; // OK
x = [10, "hello"]; // Error
6.枚举类型(enum)
枚举类型用于定义一组命名常量。默认情况下,从 0 开始为元素编号。
enum Color {
Red,
Green,
Blue
}
let c: Color = Color.Green;
// 可以手动为枚举成员编号
enum Color {
Red = 1,
Green,
Blue
}
let c: Color = Color.Green;
// 或者全部采用手动赋值
enum Color {
Red = 1,
Green = 2,
Blue = 4
}
let c: Color = Color.Green;
7.任意类型(any)
any
类型表示可以是任何类型。当需要在编译时禁用类型检查时,可以使用 any
类型。
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false;
8.空值类型(void)
void
类型用于表示没有任何类型。通常用于标记函数没有返回值。
function warnUser(): void {
console.log("This is my warning message");
}
9.Null 和 Undefined
TypeScript 中 null
和 undefined
各自有自己的类型分别为 null
和 undefined
。默认情况下,这两种类型是所有类型的子类型。即可以将 null
和 undefined
赋值给其他类型。
let u: undefined = undefined;
let n: null = null;
10.Never 类型(never)
never
类型表示的是那些永不存在的值的类型。例如,never
类型是那些总是会抛出异常或根本不会有返回值的函数表达式或箭头函数表达式的返回值类型。
function error(message: string): never {
throw new Error(message);
}
function fail() {
return error("Something failed");
}
function infiniteLoop(): never {
while (true) {}
}
11.未知类型(unknown)
unknown
类型表示任何值。这和 any
类型类似,但更安全,因为对 unknown
类型的值进行操作之前必须进行类型断言。
let notSure: unknown = 4;
notSure = "maybe a string instead";
if (typeof notSure === "string") {
console.log(notSure.toUpperCase()); // OK
}
TypeScript 的基础数据类型涵盖了常见的编程需求,并通过类型检查机制提供了更强的代码健壮性。了解这些基础数据类型,有助于编写更清晰、更可靠的 TypeScript 代码。
TypeScript 是一种静态类型的超集,基于 JavaScript 增加了类型系统和其他功能,旨在提高代码的可维护性和开发效率。TypeScript 的类型系统允许开发者在编译时进行类型检查,从而提前发现和修正错误。
二、TypeScript 类型系统的主要特性
- 类型注解:可以在变量、函数参数和返回值等地方添加类型注解。
- 类型推断:即使没有显式声明类型,TypeScript 也会根据上下文自动推断类型。
- 接口和类型别名:用于定义复杂类型和对象的结构。
- 枚举:用于定义一组命名常量。
- 泛型:支持创建可重用的组件。
- 联合类型和交叉类型:用于灵活组合多种类型。
1.类型注解
let age: number = 25;
let name: string = "Alice";
let isStudent: boolean = true;
2.类型推断
即使没有显式声明类型,TypeScript 也会自动推断类型。
let age = 25; // 推断为 number
let name = "Alice"; // 推断为 string
3.接口
接口用于定义对象的结构。
interface Person {
name: string;
age: number;
isStudent?: boolean; // 可选属性
}
let person: Person = {
name: "Alice",
age: 25
};
4.类型别名
类型别名用于为复杂类型创建一个简单的引用。
type StringOrNumber = string | number;
let value: StringOrNumber;
value = "Hello"; // 合法
value = 42; // 合法
5.枚举
枚举用于定义一组命名常量。
enum Color {
Red,
Green,
Blue
}
let color: Color = Color.Green;
6.泛型
泛型使得函数和类能够处理不特定的数据类型,从而增加代码的复用性。
function identity<T>(arg: T): T {
return arg;
}
let output1 = identity<string>("Hello");
let output2 = identity<number>(42);
7.联合类型和交叉类型
联合类型用于表示一个值可以是多种类型之一,交叉类型用于将多种类型合并成一个类型。
// 联合类型
function printId(id: string | number) {
console.log("Your ID is: " + id);
}
printId(101);
printId("202");
// 交叉类型
interface Person {
name: string;
}
interface Employee {
employeeId: number;
}
type EmployeePerson = Person & Employee;
let employeePerson: EmployeePerson = {
name: "Alice",
employeeId: 123
};
TypeScript 的类型系统强大而灵活,能够帮助开发者在编译时捕捉错误,增强代码的健壮性和可维护性,同时也提供了很多高级特性来处理复杂的类型需求。通过类型注解、接口、类型别名、枚举和泛型等功能,TypeScript 可以有效地提高代码质量和开发效率。