交叉类型、联合类型、类型别名、类型守卫,映射类型、索引类型、类型推断、类型断言的介绍以及使用场景
时间: 2023-07-03 22:33:42 浏览: 111
1. 交叉类型(Intersection Types):将多个类型合并为一个类型,新类型将具有所有类型的成员。可以使用 `&` 符号来表示交叉类型。使用场景:适用于需要同时满足多个类型的情况。
```typescript
type Person = { name: string };
type Worker = { company: string };
type Engineer = Person & Worker;
const john: Engineer = {
name: 'John',
company: 'Google',
};
```
2. 联合类型(Union Types):表示一个值可以是多种类型之一。可以使用 `|` 符号来表示联合类型。使用场景:适用于需要在多种类型中选择一种的情况。
```typescript
type Status = 'success' | 'warning' | 'error';
function showMessage(status: Status, message: string) {
console.log(`[${status}] ${message}`);
}
showMessage('success', 'Operation succeeded');
showMessage('warning', 'Operation may have failed');
showMessage('error', 'Operation failed');
```
3. 类型别名(Type Aliases):为一个类型定义一个别名,可以更方便地引用该类型。使用场景:适用于需要多次引用相同类型的情况,或者为一个复杂类型定义一个简单易懂的名称。
```typescript
type Age = number;
type User = { name: string; age: Age };
function getUserAge(user: User): Age {
return user.age;
}
```
4. 类型守卫(Type Guards):在代码中判断一个值是否属于某个类型,从而可以进行类型特定的操作。使用场景:适用于需要针对不同类型的值进行不同的操作的情况。
```typescript
interface Circle {
kind: 'circle';
radius: number;
}
interface Square {
kind: 'square';
sideLength: number;
}
type Shape = Circle | Square;
function getArea(shape: Shape): number {
switch (shape.kind) {
case 'circle':
return Math.PI * shape.radius ** 2;
case 'square':
return shape.sideLength ** 2;
}
}
```
5. 映射类型(Mapped Types):通过将一个类型中的每个属性映射到一个新类型来创建一个新类型。使用场景:适用于需要根据已有类型创建一个新类型的情况。
```typescript
type Options = {
width: number;
height: number;
color: string;
};
type ReadonlyOptions = { readonly [K in keyof Options]: Options[K] };
const options: ReadonlyOptions = {
width: 100,
height: 200,
color: 'red',
};
```
6. 索引类型(Index Types):用来表示可以通过索引器访问的属性集合的类型。使用场景:适用于需要动态访问对象属性的情况。
```typescript
type Person = { name: string; age: number };
type PersonKeys = keyof Person; // 'name' | 'age'
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
const john: Person = { name: 'John', age: 30 };
getProperty(john, 'name'); // 'John'
getProperty(john, 'age'); // 30
```
7. 类型推断(Type Inference):TypeScript 可以根据上下文自动推断变量的类型。使用场景:适用于需要简洁地定义变量而无需手动指定类型的情况。
```typescript
const answer = 42; // number
const message = 'Hello, world!'; // string
function add(a: number, b: number) {
return a + b;
}
const result = add(10, 20); // number
```
8. 类型断言(Type Assertion):用来手动指定一个值的类型,通常在需要比 TypeScript 更好地理解代码时使用。使用场景:适用于需要手动指定类型,或者 TypeScript 无法正确推断类型的情况。
```typescript
const value: unknown = 'Hello, world!';
const length1: number = (value as string).length;
const length2: number = (<string>value).length;
```
阅读全文