TypeScript 内置了一些强大的泛型工具(Utility Types),这些工具可以帮助开发者更方便地操作和转换类型。以下是一些常用的内置泛型工具及其说明:
1. Partial<T>
将类型 T
中的所有属性变为可选。
interface Person {name: string;age: number;
}type PartialPerson = Partial<Person>;
// 结果:
// type PartialPerson = {
// name?: string;
// age?: number;
// }
2. Required<T>
将类型 T
中的所有可选属性变为必选。
interface Person {name: string;age?: number;
}type RequiredPerson = Required<Person>;
// 结果:
// type RequiredPerson = {
// name: string;
// age: number;
// }
3. Readonly<T>
将类型 T
中的所有属性变为只读。
interface Person {name: string;age: number;
}type ReadonlyPerson = Readonly<Person>;
// 结果:
// type ReadonlyPerson = {
// readonly name: string;
// readonly age: number;
// }
4. Record<K, T>
构造一个对象类型,其键为 K
类型,值为 T
类型。
type StringToNumber = Record<string, number>;
// 结果:
// type StringToNumber = {
// [key: string]: number;
// }
5. Pick<T, K>
从类型 T
中选择指定的属性 K
,构造一个新类型。
interface Person {name: string;age: number;address: string;
}type PersonNameAge = Pick<Person, 'name' | 'age'>;
// 结果:
// type PersonNameAge = {
// name: string;
// age: number;
// }
6. Omit<T, K>
从类型 T
中排除指定的属性 K
,构造一个新类型。
interface Person {name: string;age: number;address: string;
}type PersonWithoutAddress = Omit<Person, 'address'>;
// 结果:
// type PersonWithoutAddress = {
// name: string;
// age: number;
// }
7. Exclude<T, U>
从类型 T
中排除所有属于类型 U
的属性。
type T = Exclude<'a' | 'b' | 'c', 'a'>;
// 结果:
// type T = 'b' | 'c';
8. Extract<T, U>
从类型 T
中提取所有属于类型 U
的属性。
type T = Extract<'a' | 'b' | 'c', 'a' | 'f'>;
// 结果:
// type T = 'a';
9. NonNullable<T>
排除类型 T
中的 null
和 undefined
。
type T = NonNullable<string | null | undefined>;
// 结果:
// type T = string;
10. ReturnType<T>
获取函数类型 T
的返回值类型。
function foo(): number {return 42;
}type FooReturnType = ReturnType<typeof foo>;
// 结果:
// type FooReturnType = number;
11. InstanceType<T>
获取构造函数类型 T
的实例类型。
class MyClass {prop: string;
}type MyClassInstance = InstanceType<typeof MyClass>;
// 结果:
// type MyClassInstance = MyClass;
12. ThisType<T>
用于指定上下文的 this
类型。
interface MyObject {name: string;greet(this: MyObject): void;
}const obj: MyObject = {name: 'Alice',greet() {console.log(`Hello, ${this.name}`);},
};
13. Pick<T, K>
和 Omit<T, K>
的组合使用
可以结合使用 Pick
和 Omit
来创建更复杂的类型。
interface Person {name: string;age: number;address: string;phone: string;
}type PersonBasicInfo = Pick<Person, 'name' | 'age'>;
type PersonWithoutPhone = Omit<Person, 'phone'>;
14. Mapped Types
TypeScript 还支持通过映射类型(Mapped Types)来动态创建新类型。
type ReadonlyIf<T, K extends keyof T> = {[P in keyof T]: P extends K ? Readonly<T[P]> : T[P];
};interface Person {name: string;age: number;
}type ReadonlyNamePerson = ReadonlyIf<Person, 'name'>;
// 结果:
// type ReadonlyNamePerson = {
// readonly name: string;
// age: number;
// }
总结
TypeScript 的内置泛型工具极大地增强了类型系统的表达能力,使得类型定义更加灵活和精确。掌握这些工具可以帮助开发者编写更健壮、可维护的代码。