TypeScript
泛型
- 可以通过泛型占位类型,再调用函数时确定类型
- 给对象使用泛型
- 请求封装,给Promise返回类型加上泛型
- 泛型约束,访问对象的属性,必须传入已有的key
- 给对象的属性使用泛型
ts
function build<T>(a: T, b: T): Array<T> {
return [a, b];
}
function build<T,U>(a: T, b: U): Array<T | U> {
return [a, b];
}
build(1, 2);
build('a', 'b');ts
interface User<T>{
name:T
}
let a:User<string> = {name:'a'}ts
const axios = {
get<T>(url:string):Promise<T> {
return new Promise<T>((resolve, reject) => {
resolve(obect)
})
}
}
interface User {
name:string
}
axios.get<User>('/user').then(res => {
console.log(res.name)
})ts
const object = {
name: 'modify',
age: 18
}
function get<T extends object, K extends keyof T>(obj:T, key:K){
return obj[key]
}ts
interface Data {
name: string;
age: number;
sex: string;
}
type Options<T extends object> = {
[Key in keyof T]?: T[Key];
}
type DataOption = Options<Data>;区分interface和type
| 对比点 | interface | type |
|---|---|---|
| 核心用途 | 定义对象 / 类的结构 | 定义任意类型别名(对象、联合、交叉、元组等) |
| 能否重复定义 | 同名会自动合并 | 同名会报错,不可重复 |
| 继承 / 扩展 | 使用 extends 继承 | 使用 & 交叉类型实现扩展 |
| 类实现 | 可被 class implements | 仅对象类型可实现,联合类型不行 |
| 支持类型 | 只支持对象、函数、类结构 | 支持一切:基础类型、联合、交叉、元组、映射类型等 |
| 项目习惯 | 组件 Props、API 数据结构、类接口 | 工具类型、联合类型、工具函数类型 |
自定义 Omit 类型
ts
/**
* 自定义 Omit 实现
* @template T - 原始对象类型
* @template K - 需要剔除的键名联合类型 (必须 extends keyof T)
*/
type MyOmit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;