高级类型
1. 联合类型与交叉类型
- 联合类型:表示变量可以是多种类型中的一种,使用
|
符号。 - 交叉类型:将多个类型合并为一个类型,使用
&
符号。
示例:
// 联合类型
function printId(id: number | string): void {
console.log(`Your ID is: ${id}`);
}
printId(101); // 输出:Your ID is: 101
printId("202"); // 输出:Your ID is: 202
// 交叉类型
interface Person {
name: string;
age: number;
}
interface Contact {
email: string;
}
type Employee = Person & Contact; // 合并类型
const employee: Employee = {
name: "Alice",
age: 30,
email: "alice@example.com"
};
console.log(employee); // 输出:{ name: 'Alice', age: 30, email: 'alice@example.com' }
2. 类型保护与类型推断
- 类型保护:通过条件语句检查变量类型,确保在访问特定属性时类型安全。
- 类型推断:TypeScript 自动推断变量的类型。
示例:
function getLength(value: string | string[]): number {
if (typeof value === "string") {
return value.length; // 类型保护
} else {
return value.length; // 依然有效,因为 value 是 string[]
}
}
console.log(getLength("Hello")); // 输出:5
console.log(getLength(["Hello", "World"])); // 输出:2
// 类型推断
let inferredType = [1, 2, 3]; // TypeScript 推断为 number[]
inferredType.push(4);
console.log(inferredType); // 输出:[1, 2, 3, 4]
3. 映射类型与条件类型
- 映射类型:创建基于现有类型的新类型,可以对属性进行修改。
- 条件类型:根据条件表达式的结果选择类型。
示例:
// 映射类型
type Person = {
name: string;
age: number;
};
// 将所有属性变为只读
type Readonly<T> = {
readonly [K in keyof T]: T[K];
};
type ReadonlyPerson = Readonly<Person>;
const readonlyPerson: ReadonlyPerson = {
name: "Bob",
age: 25
};
// readonlyPerson.age = 30; // 报错:无法分配到 "age",因为它是只读属性
// 条件类型
type IsString<T> = T extends string ? "Yes" : "No";
type Test1 = IsString<string>; // "Yes"
type Test2 = IsString<number>; // "No"
const test1: Test1 = "Yes"; // 合法
const test2: Test2 = "No"; // 合法
总结
通过联合类型与交叉类型、类型保护与类型推断,以及映射类型与条件类型,TypeScript 提供了强大的类型系统,使得开发者能够更灵活、安全地处理数据,提升代码的可维护性和可读性。