文章目录
- 1. 基本类型别名
- 2. 对象类型别名
- 3. 交叉类型(Intersection Types)
- 4. 联合类型(Union Types)
- 5. 映射类型(Mapped Types)
- 6. 条件类型(Conditional Types)
- 7. 索引访问类型(Indexed Access Types)
- 8. 推断类型(Inferred Types)
- 9. 泛型(Generics)
在TypeScript(简称TS)中, type 关键字用于创建类型别名,它允许你为现有的类型创建一个新的名字,这有助于组织代码、提高可读性,并允许你创建更复杂的类型。
1. 基本类型别名
type 最简单的用法是为现有的基本类型(如 string、number、boolean 等)创建别名。
type Name = string;
type Age = number; let name: Name = "Alice";
let age: Age = 30;
2. 对象类型别名
可以使用 type 来定义对象的形状,这类似于 interface
,但 type 允许你在单个声明中定义更复杂的类型。
type Person = { name: string; age: number; greet: () => void;
}; let person: Person = { name: "Alice", age: 30, greet: () => console.log("Hello!")
};
3. 交叉类型(Intersection Types)
type 可以用来创建交叉类型,它结合了多个类型的所有成员。
这类似于 interface
的 extend
type Named = { name: string };
type Aged = { age: number }; type Person = Named & Aged; let person: Person = { name: "Alice", age: 30
};
4. 联合类型(Union Types)
联合类型允许一个变量可以是几种类型中的任意一种。
type ID = string | number; let id: ID = 123;
// 你可以将 id 赋值为字符串或数字
id = "abc";
5. 映射类型(Mapped Types)
映射类型通过遍历现有类型的所有属性,并基于这些属性创建新的属性来创建新类型。
type Partial<T> = { [P in keyof T]?: T[P];
}; type PersonPartial = Partial<Person>; let personPartial: PersonPartial = { name: "Alice" // age 属性是可选的
};
6. 条件类型(Conditional Types)
条件类型允许你根据条件来定义类型。
type IsNumber<T> = T extends number ? true : false; type Result1 = IsNumber<string>; // false
type Result2 = IsNumber<123>; // true
7. 索引访问类型(Indexed Access Types)
索引访问类型通过类型上的索引签名来访问其属性的类型。
type Prop<T, K extends keyof T> = T[K]; type PersonProps = { name: string; age: number;
}; type NameProp = Prop<PersonProps, 'name'>; // string
8. 推断类型(Inferred Types)
在TypeScript中,当你定义一个变量并赋值时,TypeScript可以推断出该变量的类型。但有时候,你可能想明确指定这个推断出的类型,这时可以使用 type 来创建一个别名。
const arr = [1, 2, 3];
type ArrayType = typeof arr; // 推断出 ArrayType 是 number[]
9. 泛型(Generics)
type 也可以和泛型一起使用,以创建可重用的类型定义。
type Id<T> = T & { id: number }; type PersonWithId = Id<Person>; let personWithId: PersonWithId = { name: "Alice", age: 30, id: 1
};