在类型不确定的情况下,使用 any 是一种选项,但通常不是最佳选择。使用 any 类型会让你失去 TypeScript 提供的类型安全性和编译时检查。以下是几种处理类型不确定性的更好方法:
联合类型(Union Types): 如果一个值可能是多种类型之一,你可以使用联合类型。
let value: string | number | boolean;
类型断言(Type Assertion): 如果你确定值的类型,但 TypeScript 不确定,你可以使用类型断言。
- let value: any = "this is a string";
- let length: number = (<string>value).length;
- // 或
- let length: number = (value as string).length;
类型守卫(Type Guards): 在运行时动态检查类型。
- if (typeof value === "string") {
- console.log(value.length); // 现在 TypeScript 知道这是一个字符串
- }
泛型(Generics): 如果你正在定义一个函数或类,并且希望它能适用于多种类型,你可以使用泛型。
- function identity<T>(arg: T): T {
- return arg;
- }
自定义类型保护(User-Defined Type Guards): 通过自定义函数,更明确地进行类型检查。
- function isString(value: any): value is string {
- return typeof value === "string";
- }
-
- if (isString(value)) {
- console.log(value.length); // 类型为 string
- }
未知类型(unknown): 与 any 类似,但更安全。你不能对一个 unknown 类型执行任何操作,除非先进行类型检查。
- let value: unknown;
- if (typeof value === "string") {
- console.log(value.length);
- }
在不确定类型的情况下,通常最好尽量避免使用 any,而是选择以上提到的更类型安全的选项。