文章目录
- 一、是什么
- 二、有哪些
- 交叉类型
- 联合类型
- 类型别名
- 类型索引
- 类型约束
- 映射类型
- 条件类型
- 三、总结
一、是什么
在 TypeScript 中,除了基本类型如 string
、number
、boolean
之外,还存在一系列高级类型。这些高级类型是 TypeScript 为了增加语言灵活性和应对复杂开发场景而提供的一些语言特性。
二、有哪些
以下是一些常见的高级类型及其应用:
交叉类型
交叉类型通过 &
操作符将多个类型合并为一个类型,新类型包含了所有合并类型的特性。
语法:
T & U
示例:
function extend<T, U>(first: T, second: U): T & U {let result: T & U = { ...first, ...second };return result;
}
联合类型
联合类型表示一个值可以是几种类型之一,使用 |
操作符定义。
语法:
T | U
示例:
function formatCommandline(command: string[] | string) {let line = typeof command === 'string' ? command.trim() : command.join(' ').trim();
}
类型别名
类型别名用来给一个类型起一个新名字,可以用于原始值、联合类型、元组等。
语法:
type SomeName = someValidTypeAnnotation
示例:
type some = boolean | string;
const b: some = true; // ok
const c: some = 'hello'; // ok
// const d: some = 123; // Error
类型别名也可以是泛型:
type Container<T> = { value: T };
类型索引
keyof
类似于 Object.keys
,用于获取一个类型中所有键的联合类型。
示例:
interface Button {type: string;text: string;
}
type ButtonKeys = keyof Button; // "type" | "text"
类型约束
类型约束通过 extends
关键字对泛型进行限制。
示例:
type BaseType = string | number | boolean;
function copy<T extends BaseType>(arg: T): T {return arg;
}
类型约束常与类型索引一起使用:
function getValue<T, K extends keyof T>(obj: T, key: K) {return obj[key];
}
映射类型
映射类型通过 in
关键字对已有类型的键进行遍历和操作。
示例:
type Readonly<T> = {readonly [P in keyof T]: T[P];
};
interface Obj {a: string;b: string;
}
type ReadOnlyObj = Readonly<Obj>;
条件类型
条件类型是一种根据条件表达式来决定类型的类型。
语法:
T extends U ? X : Y
示例:
type NonNullable<T> = T extends null | undefined ? never : T;
三、总结
TypeScript 的高级类型为开发者提供了强大的工具来处理复杂的类型关系和场景。掌握这些高级类型是深入理解和有效使用 TypeScript 的关键。随着 TypeScript 版本的不断更新,新的特性也在不断加入,因此持续学习和实践是必要的。