• 【重点突破】—— Typescript走进类型的世界


    一、编程语言的类型

    • 动态类型语言
    • 静态类型语言

    二、Typescript究竟是什么

    • Javascript that scales Javascript的超集
    • 静态类型风格的类型系统
    • 从es6到es10甚至是esnext的语法支持
    • 兼容各种浏览器,各种系统,各种服务器,完全开源

    三、官网

    typescriptlang.org

    四、为什么要使用Typescript

    • 程序更容易理解
    1. 问题:函数或者方法输入输出的参数类型,外部条件等
    2. 动态语言的约束:需要手动调试等过程
    3. 有了Typescript:代码本身就可以回答上述问题
    • 效率更高
    1. 在不同的代码块和定义中进行跳转
    2. 代码自动补全
    • 更少的错误
    1. 编译期间能够发现大部分错误
    2. 杜绝一些比较常见的错误
    • 非常好的包容性
    1. 完全兼容javascript
    2. 第三方库可以单独编写类型文件
    3. 大多数项目都支持使用typescript

    五、一些小缺点

    1. 增加了一些学习成本
    2. 短期内增加了一些开发成本

    六、安装typescript

    1. npm install -g typescript
    2. tsc -v  

    推荐使用IDE: visual Studio code

    编译成js:报错也会生成编译结果

    1. tsc test.ts
    2. cat test.js  

    七、原始数据类型和Any类型

    1. let isDone: boolean = false
    2. let age: number = 10
    3. let firstName: string = 'viking'
    4. let message: string = `Hello, ${firstName}`
    5. let u: undefined = undefined
    6. let n: null = null
    7. let notSure: any = 4
    8. notSure = 'maybe a string'
    9. notSure = true
    10. notSure.myName
    11. notSure.getName()  

    八、数组和元组

    1. let arrOfNumbers: number[] = [1, 2, 3]
    2. arrOfNumbers.push(3)
    3. function test(){
    4. console.log(arguments)
    5. }
    6. let user: [string, number] = ['viking', 20]
    7. user.push('123')  

    九、Interface 接口

    • 对对象的形状(shape)进行描述
    • Duck Typing(鸭子类型)
    1. interface person{
    2. readonly id: number;
    3. name: string;
    4. age?: number;
    5. }
    6. let viking: person = {
    7. id: 1,
    8. name: 'viking'
    9. }  

    十、函数

    在JS中,函数是一等公民

    1. const add = (x:number, y: number, z?: number) : number => {
    2. if(typeof z === 'number'){
    3. return x + y + z
    4. }else{
    5. return x + y
    6. }
    7. }
    8. let result = add(1, 2)
    9. interface ISum {
    10. (x:number, y:number, z?:number): number
    11. }
    12. let add2: ISum = add

     十一、类型推论 联合类型和类型断言

    1. //type inference
    2. let str = 'str'
    3. //union types
    4. let numberOrString: number | string
    5. numberOrString = 'abc'
    6. numberOrString = 123
    7. numberOrString.valueOf()
    8. numberOrString.toString()
    9. function getLength(input:string | number): number{
    10. const str = input as string
    11. if(str.length){
    12. return str.length
    13. }else{
    14. const number = input as number
    15. return number.toString().length
    16. }
    17. }
    18. //type guard
    19. function getLength2(input:string | number): number{
    20. if(typeof input === 'string'){
    21. return input.length
    22. }else{
    23. return input.toString().length
    24. }
    25. }

    十二、class 类  

    • 类(Class): 定义了一切事物的抽象特点
    • 对象(Object):类的实例
    • 面向对象(OOP)三大特性: 封装、继承、多态
    1. //封装
    2. class Animal {
    3. constructor(name){
    4. this.name = name
    5. }
    6. run(){
    7. return `${this.name} is running`
    8. }
    9. }
    10. const snake = new Animal('lily')
    11. console.log(snake.run())
    12. //继承
    13. class Dog extends Animal {
    14. bark() {
    15. return `${this.name} is barkong`
    16. }
    17. }
    18. const xiaobao = new Dog('xiaobao')
    19. console.log(xiaobao.run())
    20. console.log(xiaobao.bark())
    21. //多态 - 重写
    22. class Cat extends Animal {
    23. static categories = ['mammal']
    24. constructor(name) {
    25. super(name)
    26. console.log(this.name)
    27. }
    28. run(){
    29. return 'Meow, ' + super.run()
    30. }
    31. }
    32. const maonao = new Cat('maomao')
    33. console.log(maomao.run())

    Typescript中的类

    • Public: 修饰的属性或方法是共有的
    • Private: 修饰的属性或方法是私有的
    • Protected: 修饰的属性或方法是受保护的

    十三、类和接口

    • 继承困境
    • 类可以使用implements来实现接口
    1. interface Radio {
    2. switchRadio(trigger: boolean) : void;
    3. }
    4. interface Battery {
    5. checkBatteryStatus(): void;
    6. }
    7. interface RadioWithBattery extends Radio{
    8. checkBatteryStatus(): void;
    9. }
    10. class Car implements Radio{
    11. switchRadio(trigger: boolean){
    12. }
    13. }
    14. class CellPhone implements RadioWithBattery {
    15. switchRadio(trigger: boolean){
    16. }
    17. checkBatteryStatus(){
    18. }
    19. }

    十四、枚举  

    1. //常量枚举 - 双向映射
    2. const enum Direction {
    3. Up = 'UP',
    4. Down = 'DOWN',
    5. Left = 'LEFT',
    6. Right = 'RIGHT'
    7. }
    8. // console.log(Direction.up)
    9. // console.log(Direction[0])
    10. const value = 'UP'
    11. if(value === Direction.Up){
    12. console.log('go up!')
    13. }

    十五、泛型

    相当于一个占位符,一个变量,把定义好的参数类型原封不动的输出

    1. function echo<T>(arg: T): T {
    2. return arg
    3. }
    4. const str: string = 'str'
    5. const result = echo(str)
    6. function swap<T, U>(tuple: [T, U]):[U, T]{
    7. return [tuple[1], tuple[0]]
    8. }
    9. const reusult2 = swap(['string', 123])
    10. function echoWithArr<T>(arg: T[]): T[] {
    11. console.log(arg.length)
    12. return arg
    13. }
    14. const arrs = echoWithArr([1, 2, 3])
    15. interface IWithLength {
    16. length: number
    17. }
    18. function echoWithLength<T extends IWithLength>(arg: T): T {
    19. console.log(arg.length)
    20. return arg
    21. }
    22. const str2 = echoWithLength('str')
    23. const obj = echoWithLength({length: 10})
    24. const arr2 = echoWithLength([1, 2, 3])
  • 相关阅读:
    在Biwen.QuickApi中整合一个极简的发布订阅(事件总线)
    【数据结构初阶】复杂链表复制+带头双向循环链表+缓存级知识
    go语言实现LeetCode59 螺旋矩阵Ⅱ
    git全局设置账号及ssh连接公私钥获取
    pandas学习(三) grouping
    《自然语言处理》复习
    这几类外贸订单不要随意接
    有趣的手机软件分享,感兴趣的朋友来瞧瞧
    java-php-net-python-篮球网站文献综述计算机毕业设计程序
    SpringCloud Ribbon / Feign
  • 原文地址:https://blog.csdn.net/qq_34235864/article/details/126351018