TypeScript由浅到深(下篇)
在TypeScript中,类型可以从简单扩展到复杂。下面是一些更复杂的类型操作的例子:
交叉类型(Intersection Types)
交叉类型是将多个类型合并为一个新类型,新类型包含了所有类型的特性。
type LeftType = { a: string };
type RightType = { b: number };
type IntersectionType = LeftType & RightType;
const value: IntersectionType = { a: "hello", b: 123 };
联合类型(Union Types)
联合类型允许一个变量存在多种类型中的一种。
type UnionType = string | number;
const value: UnionType = "hello"; // OK
const value2: UnionType = 123; // OK
类型保护(Type Guards)
类型保护是一种机制,用于在运行时检查变量的类型,以确保其具有某种类型。
function isString(x: string | number): x is string {
return typeof x === "string";
}
const value: string | number = "hello";
if (isString(value)) {
// 在这个块内,TypeScript知道value是string类型
console.log(value.toUpperCase()); // OK
} else {
// 在这个块内,TypeScript知道value是number类型
console.log(value.toString()); // OK
}
类型别名(Type Aliases)
类型别名允许你给一个类型定义一个名字。
type AliasType = string | number;
const value: AliasType = "hello"; // OK
const value2: AliasType = 123; // OK
字符串字面量类型
字符串字面量类型允许你定义一个类型,它仅仅是一个或多个特定字符串的联合。
type StringLiteral = "success" | "warning" | "error";
function showMessage(result: StringLiteral) {
switch (result) {
case "success":
console.log("Operation succeeded.");
break;
case "warning":
console.log("Operation completed with warnings.");
break;
case "error":
console.log("Operation failed.");
break;
}
}
showMessage("success"); // OK
showMessage("info"); // Error: Argument of type '"info"' isn't assignable to parameter of type 'StringLiteral'.
泛型(Generics)
泛型是支持封装可复用代码的一种机制,它可以让你写出适用于多种类型的代码。
function identity<T>(arg: T): T {
return arg;
}
const result = identity<string>("hello"); // OK
const result2 = identity(123); // OK
这些是TypeScript中更复杂的类型操作。学习这些概念需要一定的类型系统知识和实践经验。
评论已关闭