TypeScript之type
在TypeScript中,type
是一个非常强大的工具,用于定义自定义类型。它可以帮助开发者更灵活地描述数据结构,从而增强代码的类型安全性。与 interface
类似,type
也用于定义类型,但它们在语法和用途上有一些区别。
1. type
的基本用法
type
可以用来定义新的类型别名,这些别名可以是基本类型、联合类型、元组类型、对象类型等。
(1)基本类型别名
type StringOrNumber = string | number;
type StringArray = string[];
type NumberArray = Array<number>;
在上面的例子中:
StringOrNumber
是一个联合类型,表示可以是string
或number
。StringArray
是一个字符串数组的类型别名。NumberArray
是一个数字数组的类型别名。
(2)对象类型
type
可以定义对象的结构,类似于 interface
:
type Point = {x: number;y: number;
};
使用时:
let point: Point = { x: 10, y: 20 };
(3)联合类型
type
可以定义联合类型,表示一个值可以是多种类型之一:
type StringOrNumber = string | number;
使用时:
let value: StringOrNumber = "hello";
value = 123; // 也可以
(4)元组类型
type
可以定义元组类型,表示一个固定长度的数组,每个位置的类型是固定的:
type StringNumberPair = [string, number];
使用时:
let pair: StringNumberPair = ["hello", 123];
(5)函数类型
type
可以定义函数的类型,包括参数类型和返回值类型:
type SearchFunc = (source: string, subString: string) => boolean;
使用时:
let mySearch: SearchFunc = function (source: string, subString: string): boolean {return source.search(subString) !== -1;
};
2. type
的高级用法
(1)交叉类型
type
可以使用交叉类型(&
)来组合多个类型:
type Person = { name: string; age: number };
type Loggable = { log: () => void };type PersonWithLogging = Person & Loggable;
使用时:
let person: PersonWithLogging = {name: "Alice",age: 25,log() {console.log(`Name: ${this.name}, Age: ${this.age}`);}
};
(2)条件类型
type
可以定义条件类型,根据条件动态生成类型:
type IsNumber<T> = T extends number ? "Yes" : "No";
使用时:
type IsNumberResult1 = IsNumber<42>; // "Yes"
type IsNumberResult2 = IsNumber<string>; // "No"
(3)映射类型
type
可以定义映射类型,将一个类型的所有属性映射为新的类型:
type OptionsFlags<Type> = {[Property in keyof Type]: boolean;
};type FeatureFlags = {darkMode: () => void;newUserProfile: () => void;
};type FeatureOptions = OptionsFlags<FeatureFlags>; // { darkMode: boolean; newUserProfile: boolean }
(4)递归类型
type
可以定义递归类型,例如树形结构:
type Tree<T> = {value: T;children?: Tree<T>[];
};
使用时:
let tree: Tree<string> = {value: "root",children: [{value: "child1",children: [{ value: "grandchild1" }, { value: "grandchild2" }]},{value: "child2"}]
};
3. type
与 interface
的区别
interface
:- 主要用于定义对象的结构。
- 支持扩展(
extends
)和合并(多个接口可以合并为一个)。 - 通常用于描述对象的形状。
type
:- 更通用,可以定义任何类型的别名,包括联合类型、元组类型、函数类型等。
- 不支持扩展(
extends
),但可以通过交叉类型(&
)实现类似功能。 - 更灵活,可以用于复杂的类型操作,如条件类型、映射类型等。
4. 总结
type
是TypeScript中非常强大的工具,它可以帮助开发者定义灵活的类型别名,从而增强代码的类型安全性。通过合理使用 type
,可以编写出更加安全、规范的代码。