• 004--TypeScript变量声明之解构展开


    1.解构

    解构分为数组解构和对象解构

    let input = [1,2]
    let [first,second] = input
    //上述写法相当于
    // let first = input[0]
    // let second = input[1]
    let input: [number,number] = [1,2]
    function f([first,second]: [number,number]){
      console.log(first)
      console.log(second)
    }
    f(input)  //1   2
    //编译后
    var input = [1, 2];
    function f(_a) {
        var first = _a[0], second = _a[1];
        console.log(first);
        console.log(second);
    }
    f(input);

    剩余变量

    let [first,...rest] = [1,2,3,4]
    console.log(first)//1
    console.log(rest)//[ 2, 3, 4 ]
    //编译后
    // var _a = [1, 2, 3, 4], first = _a[0], rest = _a.slice(1);
    // console.log(first);
    // console.log(rest);
    let [first] = [1,2,3,4]
    let [, second,,fourth] = [1,2,3,4]
    console.log(first)//1
    console.log(second)//2
    console.log(fourth)//4

    对象解构

    let o = {
      a: 'foo',
      b: 12,
      c: 'bar'
    }
    
    let {a, b} = o
    console.log(a)//foo
    console.log(b)//12
    
    let {a:f, ...passthrough} = o
    console.log(passthrough)//{ b: 12, c: 'bar'}
    let total = passthrough.b + passthrough.c.length
    console.log(total)//15

    编译后的如下所示

    var __rest = (this && this.__rest) || function (s, e) {
        var t = {};
        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
            t[p] = s[p];
        if (s != null && typeof Object.getOwnPropertySymbols === "function")
            for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)
                t[p[i]] = s[p[i]];
        return t;
    };
    var o = {
        a: 'foo',
        b: 12,
        c: 'bar'
    };
    var a = o.a, b = o.b;
    console.log(a); //foo
    console.log(b); //12
    var f = o.a, passthrough = __rest(o, ["a"]);
    console.log(passthrough);
    var total = passthrough.b + passthrough.c.length;
    console.log(total);
    let o = {
      a: 'foo',
      b: 12,
      c: 'bar'
    }
    
    let {a: newName1, b: newName2} = o//重命名
    //相当于
    // let newName1 = o.a
    // let newName2 = o.b
    //其实这样很容易引起困惑,导致我们给参数指定类型只能这样指定
    // let {a, b}: {a: string, b: number} = 0
    //默认值的情况
    function keepWholeObject(wholeObject: { a: string, b?: number }) {
      //上述b参数是个可选参数,传进来可能是个undefined
      //我们可以给b一个默认值
      let {a, b = 100} = wholeObject 
    }
    function f({ a, b = 0 } = { a: ' ' }): void {
      //给a定义了一个默认值,如果是对象必须传入a值
    }
    f({ a: 'yes' });//这样是没问题的
    f()//这样写也是没问题的
    f({})//报错 类型推断里面b是个可选参数,a不是

    展开

    数组展开

    let first = [1, 2];
    let second = [3, 4];
    let bothPlus = [0, ...first, ...second, 5];
    console.log(bothPlus)//[ 0, 1, 2, 3, 4, 5 ]
    //实际上这个过程是个浅拷贝的过程,不会影响原始数组
    //编译后的文件
    var first = [1, 2];
    var second = [3, 4];
    var bothPlus = [0].concat(first, second, [5]);
    console.log(bothPlus);

    对象展开

    let defaults = {
      food: 'spicy',
      price: '$10',
      ambiance: 'noisy'
    }
    
    let search = { ...defaults, food: 'rich' }
    console.log(search)//{ food: 'rich', price: '$10', ambiance: 'noisy' }
    //后面的覆盖前面的 food
    //编译成es2015
    // let defaults = {
    //   food: 'spicy',
    //   price: '$10',
    //   ambiance: 'noisy'
    // };
    // let search = Object.assign({}, defaults, { food: 'rich' });
    // console.log(search); //{ food: 'rich', price: '$10', ambiance: 'noisy' }

    2019-05-24  10:18:42

    工欲善其事,必先利其器
  • 相关阅读:
    《ASP.NET Core项目开发实战入门》带你走进ASP.NET Core开发
    网络监控工具 iftop dstat
    可进行组合的枚举
    查看Qt自带的QSS
    通过文件设置QSS
    QString转QByteArray
    error: jump to case label
    error: static member function cannot have cv-qualifier
    C++ std::vector的大小和容量
    获取QMessageBox返回值
  • 原文地址:https://www.cnblogs.com/ccbest/p/10916480.html
Copyright © 2020-2023  润新知