React: React Typescript CheatSheet
TypeScript
1. 删除对象中某些key
2.自定义类型错误信息
3. 获取对象/数组/枚举的key和vlaue类型
4. 定义全局变量类型的几种方式(Window、Global、Node、ProcessEnv)
Vite Monorepo TypeScript 环境变量处理
5. Import type 两种用法
最开始TypeScrript
支持使用 import type
的方式单独引入类型,并且不会再打包的时候,将代码打包进入,例如 import 枚举值的时候
但是这样有一个问题,就是如果既需要引入Type又需要引入其他模块的时候,需要写两个 import
这样写会比较麻烦,所以后面 ts 又出了括号内的 type:
如果只需要引入类型的时候使用 import type {} 'module'
,又有成员导入又有type导入的时候,使用括号内的 import { type A } from 'module'
.
6. v4.9 satisfies 特性
satusfies
主要提供两个方面的功能
- 类型安全检查,确保变量匹配指定的类型,比
as
更安全
- 使 TypeScript 根据提供给此变量的值然后推断出具体类型
上面的User是一个Object类型,下面两个字段,birthCity
和currentCity
,这两个字段都有可能是City
或者CityCoordiatees
类型
定义 user变量:
user
变量类型是满足User
类型的,因为我们指定了 User类型,所以最终创建的变量类型为:
这种情况下如果我们想要对某个属性调用方法,TypeScript是无法知道属性具体是哪个类型的,到底是 CityName
联合类型还是CityCoordiates
对象类型,因此无法通过类型检查
在没有satisfies
之前,没有更好的办法处理这种问题,具体来说就是不可能同时:
- 确保变量匹配指定的类型
- 使
TypeScript
根据提供给此变量的值然后推断出具体的类型
使用satisfies
处理
通过 satisfies
处理之后的 user
类型为
可以看到 TypeScript
根据我们定义的变量自动推导出了具体的属性类型,下面代码不会报错
如果我们提供的变量不满足 satisfies
指定的类型时,TypeScript
会抛出错误, 所以使用 satisfies
来替代as
会更加的安全。
目的在于不改变变量类型的情况下对变量强制执行约束,比 as
更加严谨,可替换as
使用。
7. 利用 declare Global 定义全局工具类
一些通用的TS 工具函数,经常会使用到,但是又不想每次都 import 一下,可以将其定义在 declare global
中,可以新建一个文件,专门存放这些需要全局使用的工具类
来源:https://twitter.com/mattpocockuk/status/1593584053042630657
8. Type
8.1 条件类型
在类型系统中充当“if语句”。通过泛型创建,然后通常用于减少类型并集中的选项数量。
8.2 模板字符串组合类型
模板字符串可用于组合多个字符串类型为一个新的类型
8.3 映射类型
8.4 可区分联合类型
👉 TypeScript 可区分联合类型
9. 根据不同的type限制不同的类型选项
当type
为 A
是,可以输入的key
只能是 A
的类型,为 B是只能是B
的类型选项
10. (美化)将交集类型提示平铺展示
Matt Pocock 在 Twitter: “Here’s a quick thread on a super useful type helper you’ve probably never heard of (nope, not even advanced folks). https://t.co/HSCQueVNXO” / Twitter
11.类型守卫用法
类型守卫 | 深入理解 TypeScript
类型守卫推荐使用 instanceof
function fn(a) {
if (a instanceof Object) {
..
}
if (a instanceof Function) {
..
}
..
}
12.cosnt 类型断言 & const 类型参数
在 5.0 之前可以使用的 as const
类型断言,这种断言只能针对对象类型,无法对函数类型进行处理
TypeScript 5.0
提供了 const 类型参数
如果不想得到的obj 对象中 name 的类型为 string
, 而是字符串Yang
,可以先通过 as const
类型断言来转换 input 的类型,再传入函数
这种写法只能针对对象,在函数调用之前处理,如果想在函数内部处理,可以通过 5.0 的 const
类型参数
13.使用$字符串匹配类型
从对象中获取以on
开头的所有键。
14. 模板字符串高级使用
模板字符串高级用法
15. string & {} 文本类型与字符串类型联合
Icon 组件定义 Color 类型如下,本意是既可以传入 primary
与 secondary
,也可以传入任意颜色,但是实际上只有 string
类型生效, primary
和 secondary
失效
解决方案
将 string 类型与一个空对象相交
原因:
当字符串类型文字类型与string类型创建联合时, Typescript 会立即将类型扩展为 string 类型。因此在使用 Color 类型之前,Typescript 就已经忘记了 primary 与 secondary。但是通过 string 类型与空对象相交,可以欺骗 TypeScript 保留字符串文字类型更长时间。