在 TypeScript 中怎样尽量少的使用 any?
最近在用ts写项目,但用着用着发现出现了大量的any。。比如用axios接收返回值的时候,我就会写(res:any)=>{}
问下大佬们写前端的时候,是不是还专门放了个文件夹写type
或interface
?是每次导入文件还是直接用d.ts
全局声明呢?
然后写node的时候,比如uuid
类型的number,传入的参数必须是string,但是在entity
中又是number类型,搞得我只好用any。。
最后,能看看各位的文件是咋分的吗?
回答:
当然先认真通读一遍官方文档和翻译后的中文文档(版本比较旧但是大多数知识点都有)
typescript 英文文档
typescript 中文文档(版本比较旧)
对整个类型系统有个比较全面体系的大致认识,然后尽量避免使用any,多用interface和type声明类型,联合类型,交叉类型,类型推论,typeof类型保护,instanceof类型保护,自定义的类型保护,可null类型,模块声明(.d.ts怎么给js的any类型对象声明类型),泛型(用来应对数据类型是动态可变的,比如网络请求返回的数据类型),
关于类型保护,ts能够自动收窄类型范围,instanceof、typeof、自定义的类型保护、赋值语句、===、if else语句(根据条件的布尔值真假收窄类型范围)都能触发类型保护从而收窄类型,下面的链接有很详细的文章解读
TypeScript 的类型收窄
function isString(x: any): x is string { return typeof x === "string"
}
在一些js过于动态,ts没有办法的时候,如果你能确定运行时一定是能类型转换成功的(或者是内部可以用any),那么可以直接 as (unknown as) Gundam,函数返回具体类型就好。
如果是第三方库是js写的,而且没有提供ts类型声明文件,ts也不能完全自动推导类型,可以值尝试写全局/局部.d.ts文件自己手动添加类型声明。
.d.ts 可以根据需要写在源码src目录里,这样整个src都可以使用,根据情况分为env.d.ts,(库名称).d.ts,再根据需要增加文件,比如window.d.ts(需要额外给window添加属性,如果可能的话,新增属性写成可undefined的类型)。
回答:
可以使用泛型规范接口返回的数据,比如像这样
interface Student { name: string
id: number
}
// 此时的info就可以是 ApiResponse<Student> 或者嫌麻烦,处理一下直接为 Student
const info = await request<ApiResponse<Student>>(options)
以上是 在 TypeScript 中怎样尽量少的使用 any? 的全部内容, 来源链接: utcz.com/p/932856.html