- Js的超集
- 多出来的是 类型系统 和ES6+ 的支持
- 会编译为原始的js
- 任何一种js运行环境都支持
- 相比于Flow 功能更强大,生态更健全,更完善 Vs code 对TS的支持特别友好
- 缺点一:语言本身多了很多概
- 还好是渐进式。可以按照js的编码方法 一点点来
- 缺点二:
- 项目初期,TS会增加一些成本 编写一些类型限制
- Ts快速上手
- 按照typescript 模块
- tsc 命令 编译ts模块 编译为js 自动转换ES6 检测类型
- tsc还可以编译整个项目
- 配置文件 使用 yarn tsc —init 生产配置文件
- target属性 设置编译后的js采用的ecmasrcipt标准
- sourceMap 源代码映射
- 配置文件 使用 yarn tsc —init 生产配置文件
- tsc还可以编译整个项目
- Ts原始类型
- 非严格模式下
- string number boolean 可以赋值为null
- 标准库 内置对象所对应的声明 必须引用 否则TS找不到对应类型 就会报错
- 非严格模式下
- 作用域问题
- 可以用模块作用域解决 export {}
- Object类型
- 泛指所有非原始类型 对象 数组 函数
- 限制对象应该用接口
- 数组类型
- 和Flow类似
- 元组类型
- 明确元素类型和元素数量 的 数组
枚举
- enum定义
- 可以给一组数值分别起更好理解名字
- 一个枚举中只可取上几个固定的值,不会超过范围
- 会影响编译后的结果 最终会编译为双向的键值对对象
- 建议常亮枚举 编译的结果 枚举会被移除 使用的地方替换为常量 ```javascript // 声明枚举 指定 // enum PostStatus { // Draft = 0, // Unpublished = 1, // Published = 2, // } //不指定 会根据第一个数字累加 字符串枚举的话需要手动给每个名称初始化一个字符串值 enum PostStatus { Draft = 0, Unpublished = 1, Published = 2, } //常量枚举 加const const enum PostStatus{
}
const post = { title: “Hello TypeScript”, content: “TypeScript is a typed superset of JavaScript”, status: PostStatus.Draft, //0//2 }
- 函数类型
- 参数个数和类型也必须完全一致
- 参数名称后加? 或者给参数加默认值 必须出现在参数列表的最后。参数按位置传递
- 需要接受任意个数的参数,使用ES6rest操作符 ...rest:number[]
- 任意类型
- any 也是弱类型的,TS不对其进行类型检测。语法上不报错
- 隐式类型判断
- 没有明确的类型注解,TS会根据用法推断。如果无法推断 会any
- 虽然支持,但是还是给每个变量添加明确的类型,便于理解
- 类型断言
- 辅助TS明确代码中成员类型
- 使用as
```javascript
const nums = [110, 120, 130, 140, 150]
const res = nums.find((i) => i > 0)
// const square = res * res //不明确res是数字还是Undefined
const num1 = res as number //明确是number
const square = num1 * num1
接口Interfaces
- 约定对象的结构
- 使用就必须遵循全部的约定
- interface定义
- 编译后没有。只是编码阶段类型约束
interface Post {
title: string
content: string
}
function printPost(post: Post) {
console.log(post.title)
console.log(post.content)
}
接口补充
- 可选成员
- 成员名后加? 实际就是标记我们锁定的类型或 Undefined
- 只读
- 成员名前加readonly 加了之后不能修改
- 动态成员
- [key:类型] : 类型
- 可选成员
类
- 描述一类对象的抽象
- TS中增强了class相关语法
- 复制的变量要在类中先声明,声明之后必须给个初始值
class Proson {
name: string
age: number
constructor(name: string, age: number) {
this.name = name
this.age = age
}
sayHi(msg:string):void{
console.log(`I am ${this.name},${msg}`)
}
}
- 复制的变量要在类中先声明,声明之后必须给个初始值
类的访问修饰符
- 属性名称前加privade 私有属性
- 默认加public
- protected受保护的 在外部也不能访问
- 区别 受保护的可以在子类中访问。私有的不可以
- 构造函数的访问修饰符一样。私有不能被实例化,也不能继承,在类中添加静态方法
- new 相当于调用构造函数
- 类的只读属性
- 可以通过readonly将属性设置为只读 跟在修饰符后 可以在声明的时候初始化,或在构造函数初始化,,一旦初始化 就不能再修改
- 类和接口
- 类与类之间也会有些共同的特征。用接口去抽象 implements 去使用接口
- 一个接口只约束一个能力
- 类与类之间也会有些共同的特征。用接口去抽象 implements 去使用接口
- 抽象类
- abstract 修饰 只能被继承
- 抽象方法成员 abstract 修饰 子类必须去实现这个方法 不需要有函数体
泛型
只定义函数接口或类的时候没有指定具体类型,使用时去指定类型
- 不确定的类型定义为一个参数 然后去使用参数
function createArray<T>(length: number, value: T): T[] {
const arr = Array<T>(length).fill(value)
return arr
}
const res1 = createArray<string>(3,'100')
- 不确定的类型定义为一个参数 然后去使用参数
复用代码
- 类型声明
- declare
- 一个成员定义的时候没有类型声明,使用的时候去定义类型
- 引用第三方模块不包含类型声明文件,按照一个所对应的类型声明模块 常规的
- @type/模块名 没有的话使用declare语句
- declare