• Js的超集
      • 多出来的是 类型系统 和ES6+ 的支持
      • 会编译为原始的js
      • 任何一种js运行环境都支持
      • 相比于Flow 功能更强大,生态更健全,更完善 Vs code 对TS的支持特别友好
      • 缺点一:语言本身多了很多概
        • 还好是渐进式。可以按照js的编码方法 一点点来
      • 缺点二:
        • 项目初期,TS会增加一些成本 编写一些类型限制
    • Ts快速上手
      • 按照typescript 模块
      • tsc 命令 编译ts模块 编译为js 自动转换ES6 检测类型
        • tsc还可以编译整个项目
          • 配置文件 使用 yarn tsc —init 生产配置文件
            • target属性 设置编译后的js采用的ecmasrcipt标准
            • sourceMap 源代码映射
    • 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 }

    1. - 函数类型
    2. - 参数个数和类型也必须完全一致
    3. - 参数名称后加? 或者给参数加默认值 必须出现在参数列表的最后。参数按位置传递
    4. - 需要接受任意个数的参数,使用ES6rest操作符 ...rest:number[]
    5. - 任意类型
    6. - any 也是弱类型的,TS不对其进行类型检测。语法上不报错
    7. - 隐式类型判断
    8. - 没有明确的类型注解,TS会根据用法推断。如果无法推断 any
    9. - 虽然支持,但是还是给每个变量添加明确的类型,便于理解
    10. - 类型断言
    11. - 辅助TS明确代码中成员类型
    12. - 使用as
    13. ```javascript
    14. const nums = [110, 120, 130, 140, 150]
    15. const res = nums.find((i) => i > 0)
    16. // const square = res * res //不明确res是数字还是Undefined
    17. const num1 = res as number //明确是number
    18. const square = num1 * num1
    • 接口Interfaces

      • 约定对象的结构
      • 使用就必须遵循全部的约定
      • interface定义
      • 编译后没有。只是编码阶段类型约束
        1. interface Post {
        2. title: string
        3. content: string
        4. }
        5. function printPost(post: Post) {
        6. console.log(post.title)
        7. console.log(post.content)
        8. }
    • 接口补充

      • 可选成员
        • 成员名后加? 实际就是标记我们锁定的类型或 Undefined
      • 只读
        • 成员名前加readonly 加了之后不能修改
      • 动态成员
        • [key:类型] : 类型
      • 描述一类对象的抽象
      • TS中增强了class相关语法
        • 复制的变量要在类中先声明,声明之后必须给个初始值
          1. class Proson {
          2. name: string
          3. age: number
          4. constructor(name: string, age: number) {
          5. this.name = name
          6. this.age = age
          7. }
          8. sayHi(msg:string):void{
          9. console.log(`I am ${this.name},${msg}`)
          10. }
          11. }
    • 类的访问修饰符

      • 属性名称前加privade 私有属性
      • 默认加public
      • protected受保护的 在外部也不能访问
        • 区别 受保护的可以在子类中访问。私有的不可以
      • 构造函数的访问修饰符一样。私有不能被实例化,也不能继承,在类中添加静态方法
        • new 相当于调用构造函数
    • 类的只读属性
      • 可以通过readonly将属性设置为只读 跟在修饰符后 可以在声明的时候初始化,或在构造函数初始化,,一旦初始化 就不能再修改
    • 类和接口
      • 类与类之间也会有些共同的特征。用接口去抽象 implements 去使用接口
        • 一个接口只约束一个能力
    • 抽象类
      • abstract 修饰 只能被继承
      • 抽象方法成员 abstract 修饰 子类必须去实现这个方法 不需要有函数体
    • 泛型

      • 只定义函数接口或类的时候没有指定具体类型,使用时去指定类型

        • 不确定的类型定义为一个参数 然后去使用参数
          1. function createArray<T>(length: number, value: T): T[] {
          2. const arr = Array<T>(length).fill(value)
          3. return arr
          4. }
          5. const res1 = createArray<string>(3,'100')
      • 复用代码

    • 类型声明
      • declare
        • 一个成员定义的时候没有类型声明,使用的时候去定义类型
      • 引用第三方模块不包含类型声明文件,按照一个所对应的类型声明模块 常规的
        • @type/模块名 没有的话使用declare语句