这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天
文档:
JS:动态类型;弱类型语言
- 动态:执行的时候才检查类型;编译发生在执行时
TS:静态类型;弱类型语言
-
静态:编译发生在一开始
弱类型语言:类型转化,存在隐式类型转换
强类型语言
为什么TS?
静态类型
- 可读性增强:基于语法解析TSDoc,ide增强
- 可维护性增强:在编译阶段暴露大部分错误;多人合作的大型项目中,获得更好的稳定性和开发效率
JS的超集
-
包含于兼容所有Js特性,支持共存
-
支持渐进式引入与升级
基本语法
TypeScript里的类型注解是一种轻量级的为函数或变量添加约束的方式。
- readonly:只读属性
- ?:可选属性,可以存在可以不存在
- any:任意属性
前三种简化写法
IArr4是任意类型的
type别名
函数泛型,和其他的有一些区别
如果用any就会丢失数据类型;范型可以
有点像Java
两个特性
- 泛型约束
- 泛型参数默认类型
type定义了类型别名
KeyBy将Array转化object
- 传入了一个空对象,result是一个object,通过as进行类型断言
高级类型
联合/交叉类型
类型保护:去对一个联合类型判断时候,需要他们共有的类型;第一段代码会报错
我们怎么去修改第一个版本呢?
类型守卫:
- 返回值 arg is IA;当返回是true的时候,arg一定是IA
- as类型断言,当有a的时候一定是IA
只有类型完全没有重合的时候需要去做类型守卫
但是这样很麻烦
function reverse(input: string | any[]): string | any[] {
if (typeof input === 'string') {
return input.split('').reverse().join('');
} else if (Array.isArray(input)) {
return input.reverse();
} else {
throw new Error('Invalid input type, expected string or array.');
}
}
reverse传入一个string或者array然后翻转
字符串不支持reverse,就先把他转换成数组,再reverse再join
typeof是默认的自动保护/type也是
第一种比较安全,第二种可能存在参数污染
keyof类型索引
in表示每个
Partial已经是内嵌类型
Promise是函数的返回值,同个泛型表达,用的时候才表示
ReturnType:传入一个函数,就可以返回这个函数的返回类型
extends跟随泛型出现,表示类型推断;和三元表达式一样
这段代码是 TypeScript 中的一个类型别名(Type Alias),用于定义一个泛型类型 IReturnType<T>,它的作用是获取函数类型 T 的返回值类型。
具体而言,这个类型别名使用了 TypeScript 中的条件类型(Conditional Types)和类型推断(Type Inference)机制,其中:
T extends (...args: any) => any表示T必须是一个函数类型,且可以接受任意类型的参数;...args: any表示函数可以接受任意数量的参数;=> infer R表示通过类型推断来获取函数的返回值类型,将其存储在类型变量R中;? R : any表示如果成功获取到函数的返回值类型R,则返回R,否则返回any类型。
因此,对于一个给定的函数类型 F,可以使用这个类型别名来获取它的返回值类型,例如:
typescriptCopy code
function add(a: number, b: number): number {
return a + b;
}
type ResultType = IReturnType<typeof add>; // 等同于 type ResultType = number
在这个示例中,我们定义了一个名为 add 的函数,它接受两个参数 a 和 b,并返回它们的和。我们可以使用 typeof 操作符来获取 add 函数的类型,然后通过 IReturnType 类型别名来获取其返回值类型 number。
工程应用
处理JS文件
-
浏览器Web
-
Node.js
- Webpack loader:将文件转成JS文件
- 配置tsconfig.js
- 打包
- 编译与类型检查