TypeScript高级类型


高级类型

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 提供了强大的类型系统,使得开发者能够更灵活、安全地处理数据,提升代码的可维护性和可读性。