2.17 递归 TS 接口 枚举

62 阅读3分钟

递归

递归是什么? 一个函数在内部调用自己,这个函数就是递归函数。

应用场景

  • 数组求和
    let arr = [100, 200, 300, [400, 500, [49, 59, 80, [30, 60, [80, 100]]]]]

    // 递归求和
    let num = 0
    function fn(arr) {
        // 对arr进行循环
        arr.forEach(item => {
            // 判断是否是复杂数据类型
            if (typeof item === "object") {
                // console.log(item);
                // 是的话就自己调用自己,并把当前的数据当作实参传出去
                fn(item)
            } else {
                // 不是复杂数据类型就累加求和
                num += item
            }
        })

    }
    fn(arr);
    console.log(num);
  • 斐波那契数列
 function fn(n) {
        if (n == 1 || n == 2) return 1
        return fn(n - 1) + fn(n - 2)
    }
    console.log(fn(8));
  • 求 children里money的总和
   let arr1 = [
        {
            name: "张三",
            money: 100,
            children: [
                { name: "张欢欢", money: 200 },
                {
                    name: "张乐乐",
                    money: 100,
                    children: [
                        { name: "张小欢", money: 300 },
                        { name: "张小乐", money: 400 },
                    ],
                },
            ],
        },
        {
            name: "李四",
            money: 100,
            children: [
                { name: "李红红", money: 500 },
                { name: "李明明", money: 600 },
            ],
        },
    ];

    let total = 0
    function fn(arr) {
        arr.forEach(item => {
            if (item.children instanceof Array) {
                fn(item.children)
            } else {
                total += item.money
            }
        })
    }
    fn(arr1)
    console.log(total);

TS中的枚举

枚举分为数字枚举、字符串枚举、异构枚举,枚举的使用是通过enum关键字进行定义。

  • 数字枚举 数字枚举默认从零开始,赋值后,从你赋值的开始依次加一,假如你给一个赋值为12,那么后面的依次为13,14,15.........
// enum Direction {
//     front = 1,
//     back = 2,
//     left = 3,
//     right = 4
// }

// function fn(direction: Direction) {
//     console.log(direction);
// }

// fn(Direction.back)
// fn(Direction.front)
  • 字符串枚举

如果设定了一个变量为字符串之后,后续的字段也需要赋值字符串,否则报错:

enum Direction {
    front = '前进',
    back = '后撤',
    left = '左满舵',
    right = '右满舵'
}

function ship(direction: Direction) {
    console.log(direction);
}

ship(Direction.back)
ship(Direction.front)
  • 异构枚举

即将数字枚举和字符串枚举结合起来混合起来使用

enum BooleanLikeHeterogeneousEnum {
  No = 0,
  Yes = 'YES',
}

TS中的接口类型

  • TypeScript 的核心原则之一是对值所具有的结构进行类型检查,并且只要两个对象的结构一致,属性和方法的类型一致,则它们的类型就是一致的。 在 TypeScript 里,接口的作用就是为这些类型命名和为代码或第三方代码定义契约。
  • 在定义接口时,不要把它理解为是在定义一个对象,{}括号包裹的是一个代码块,里面是声明语句,只不过声明的不是变量的值而是类型。声明也不用等号赋值,而是冒号指定类型。每条声明之前用换行分隔即可,也可以使用分号或者逗号。
  • 接口属性,分为可选属性 ?修饰,只读属性 readonly 修饰,多余属性(索引签名)
  • 接口继承, 一个接口可以继承自另一个或者多个接口,关键字 extends

声明接口

使用interface来声明一个接口


interface typeObj {
    name: string
    age: number
    fn: Function
}

使用 用implements来使用一个接口

class obj implements typeObj {
    name: string
    age: number
    constructor(name: string, age: number) {
        this.name = name
        this.age = age
    }

    fn(): void {
        console.log(`我是${this.name}${this.age}岁`);

    }
}