Skip to content

TypeScript —— 如何更好地组织、存储和声明类型文件

Published: at 12:00 AM

一、背景

二、实现步骤

2.1 常见方式

方式1 全局 types.ts 文件

|--src
  |-- types.d.ts    // 全局的类型文件

声明时:

使用时:

直接namespace.Type 即可使用,无需导入。

声明时:

使用时:

\

方式2 按模块(页面、组件、接口等)划分

|--src
  |-- types
    |-- common        // 公共类型
        |-- common9.ts
    |-- components    // 组件的类型
        |-- button.ts
    |-- api           // 页面中的请求类型
        |-- api1.ts
    |-- pages         // 页面中的props等类型
        |-- page2.ts
    |-- store         // 全局 状态类型
        |-- store4.ts
...

2.2 调研业内组织和存储类型文件的方法

2.3 项目现状

存在问题:

三、解决方案

以一个出现17次any的单文件为例

发现有很多any是因为事件的event的类型不知道怎么定义

  1. 逐步排查、解决方法:

发现并不能解决问题

原因是因为React针对不同事件都封装了专门的类型

可以看出 onMouseDown的类型 为React.MouseEventHandler<HTMLDivElement> | undefined

再回到声明方法的位置,添加类型

可以看到已经为e添加了类型,可以享受ts带来的语法提示。

  1. 根据上下文判断类型

cellsList已有类型,看代码可知rowGroup是依赖cellsList的一部分属性

rowGroup 是二维数组,cellsList是一维数组,需要在item类型上进行 拓展 如图

还有可能会写这样的类型,虽然第一时间不会有错误,但是如果 cellsList 类型有改动,则rowGroupItemType依赖的 itemsList 的类型 会不匹配

四、eslint约束

可以使用eslint限制项目中ts的规范 如 '@typescript-eslint/no-explicit-any': 'error'不允许显式的 any 类型。

image.png 更多 lint规则

五、总结

不同的模式和框架从事不同的项目、都会养成不同的编码习惯,需要针对项目进行灵活的规划。

只有在编写越来越多的代码并且项目规模逐渐增长以及团队成员逐渐变多之前,才会看到最适合每种

类型的项目甚至项目的每个阶段的组织结构。

参考文章

TypeScript | Organizing and Storing Types and Interface

How to organize TypeScript interfaces