Skip to content
本页目录

ts实践与vben框架的ts用法分析

image-20230515190544654

1.ts实践

如何在项目中用好 TypeScript 🤔 - 掘金 (juejin.cn)

对应的代码练习

2.ts处理返回接口

🚀 TS项目如何高效处理接口返回数据 - 掘金 (juejin.cn)

通常项目中用到ts的时候就是类型校验

主要还是接口数据的类型的校验

例如

typescript
const fetchInfo = async (url: string, id: string) => {
  return $http.get(url, params);
}

const res = await fetchInfo('/info', '886');

// 假设 `/info` 接口返回如下数据
{ id: '886',
  🙈:{ 
      name: 'Jack', 
      📱: { brand: 'Chinese Pineapple' } 
  } 
}

如何用ts来顶返回的接口呢

1.any大法

typescript
const res:any = await fetchInfo('/info', '886');
console.log(res.🙈.name) // Jack
console.log(res.🙈.📱.brand)  // Chinese Pineapple

2.更加优雅的 interface 写法:

typescript
/** 根据接口返回的数据,声明对应的 interface **/
interface Info {
  id: string;
  🙈: Monkey;
}

interface Monkey {
  name: string;
  📱: Phone;
}

interface Phone {
  brand: string;
}

/** 改写 `fetchInfo` 函数返回值类型 **/
const fetchInfo = async (url: string, id: string): Promise<Info> => {
  return $http.get(url, params);
}
const res = await fetchInfo('/info', '886');
console.log(res.🙈.name) // Jack
console.log(res.🙈.📱.brand)  // Chinese Pineapple

总结:

通过上面的总结不难看出,interface 方式优势众多,但同时也有着一个致命的弊端:

我们在前期的开发过程中需要对所有接口返回的不同数据类型定义对应的 interface

例如上面示例的 /info 接口我们就需要定义三个 interface ,实际项目中,字段数量可能达到几十上百个!

基于上面 interface 方式所面临的问题

给大家安利一款前端在线代码生成工具:JsonToAnyGitee / GitHub

3.vben的项目ts玩法

3.1准备工作

介绍 | Vben Admin (vvbin.cn)

精简版仓库地址

vbenjs/vue-vben-admin at thin (github.com)

  • 获取项目代码
git clone https://github.com/anncwb/vue-vben-admin.git
  • 安装依赖
cd vue-vben-admin
git checkout thin
pnpm install
  • 运行
pnpm serve
  • 打包
pnpm build

3.2先看tsconfig.json文件

观察到项目的ts的声明文件和配置

image-20230515183434879

3.3观察src下的api的getMenuList接口最具代表性

image-20230515183814244

可以看到axios映入 然后用枚举去定义接口地址 还有一个泛型类型getMenuListResultModel,这个定义了其返回的类型

image-20230515183926938

为什么是

typescript
export const getMenuList = () => {
  return defHttp.get<getMenuListResultModel>({ url: Api.GetMenuList })
}

image-20230515184150444

去掉会怎么样

image-20230515184246719

我们也可以点入get方法中去一探究竟,可以看到其类型定义是一个泛型函数返回是Promise<T>

image-20230515184328738

api是调用接口,接口是在mock中的

image-20230515184715558

然后在需要的地方进行只用用校验过的数据

image-20230515184830090

3.4再看一个调用本地数据的例子,看看ts怎么来定义

这种可以用在做表格组件的时候,用ts来定义表格列的数据也非常实用

我们的例子再vben项目下的

image-20230515185824745

比如我们定义了一个data.ts文件

先定义类型接口


interface NavItem {
  title: string
  icon: string
  color: string
}

image-20230515185637880

然后按照类型,定义出对应类型的变量,再导出

image-20230515185736063

接着我们引入和使用的时候,就可以有代码提示了

image-20230515185427563

我们可以运行项目看一下,用ts定义类型的数据

image-20230515190524510

3.5 小挑战

其实在下面的页面也是用data.ts来定义的 按照上述方法,一起分析一下把

image-20230515190656663