TypeScript 变量声明

变量是一种使用方便的占位符,用于引用计算机内存地址。

可以看成是存储数据的容器。

var 声明

var 关键字用来定义变量。

语法

var [变量名] : [类型] = 值;

例子:

var num:number = 50

const声明

const 声明是声明变量的另一种方式,它们被赋值后不能再改变。 如下:

const msg:string = "this is a string"

尝试修改其值会报错:

const msg:string = "this is a string"
msg = 'erwre'

报错内容:
请添加图片描述

解构

解构数组

let arr = [123, 456]
let [one, two] = arr
console.log(one); //  123
console.log(two); // 456

编译成js:

var arr = [123, 456];
var one = arr[0], two = arr[1];
console.log(one); //  123
console.log(two); // 456

创建剩余变量

可以在数组里使用 ... 语法创建剩余变量,如下:

let [first, , ...rest] = [1, 2, 3, 4, 5, 6]
console.log(first);  // 1
console.log(rest);   // [3, 4, 5, 6]

编译成js:

var _a = [1, 2, 3, 4, 5, 6], first = _a[0], rest = _a.slice(2);
console.log(first); // 1
console.log(rest); // [3, 4, 5, 6]

解构指定元素

也可以解构指定元素,如下:

let [,two,,,five,six] = [1, 2, 3, 4, 5, 6]
console.log(two);  // 2
console.log(five);  // 5
console.log(six);  // 6

编译成js:

var _a = [1, 2, 3, 4, 5, 6], two = _a[1], five = _a[4], six = _a[5];
console.log(two); // 2
console.log(five); // 5
console.log(six); // 6

对象解构

let obj = {
    names: "xiaoming",
    age: 12,
    grade: "six"
};
let { names, age } = obj;
console.log(names) // xiaoming
console.log(age) // 12

编译成js:

var obj = {
    names: "xiaoming",
    age: 12,
    grade: "six"
};
var names = obj.names, age = obj.age;
console.log(names); // xiaoming
console.log(age); // 12

也就是通过 obj.names 创建了 names,通过 obj.age 创建了 age

创建剩余变量

可以在对象里使用…语法创建剩余变量,如下:

let obj = {
    first: "xiaoming",
    age: 12,
    grade: "six"
};
let { first,... rest } = obj;
console.log(first) // xiaoming
console.log(rest) // {age: 12, grade: 'six'}

编译成js:

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 obj = {
    first: "xiaoming",
    age: 12,
    grade: "six"
};
var first = obj.first, rest = __rest(obj, ["first"]);
console.log(first); // xiaoming
console.log(rest); // {age: 12, grade: 'six'}

属性重命名

可以给属性重命名不同的名字:

let obj = {
    names: "xiaoming",
    age: 12,
    grade: "six"
}
let { names:newVal, age:newAge } = obj
console.log(newVal) // xiaoming
console.log(newAge) // 12

编译成js:

var obj = {
    names: "xiaoming",
    age: 12,
    grade: "six"
};
var newVal = obj.names, newAge = obj.age;
console.log(newVal); // xiaoming
console.log(newAge); // 12

注意:这里的冒号不是指示类型的。

如果想指定它的类型,需要在其后写上完整的模式,如下:

let obj = {
    names: "xiaoming",
    age: 12,
    grade: "six"
};
let { names, age }:{ names:string, age:number } = obj;
console.log(names) // xiaoming
console.log(age) // 12

编译成js:

var obj = {
    names: "xiaoming",
    age: 12,
    grade: "six"
};
var names = obj.names, age = obj.age;
console.log(names); // xiaoming
console.log(age); // 12

展开

开操作符与解构相反。 是将一个数组展开为另一个数组,或将一个对象展开为另一个对象。

展开数组

示例:

let arr1 = [1, 2, 3];
let arr2 = [ 4, 5, 6];
let arr3 = [0, ...arr1, ...arr2, 7, 8];
console.log(arr3) // [0, 1, 2, 3, 4, 5, 6, 7, 8]
arr3[2] = 22
arr3[5] = 55
console.log(arr3) // [0, 1, 22, 3, 4, 55, 6, 7, 8]
console.log(arr1) // [1, 2, 3]
console.log(arr2) // [4, 5, 6]

编译成js:

var arr1 = [1, 2, 3];
var arr2 = [4, 5, 6];
var arr3 = [0].concat(arr1, arr2, [7, 8]);
console.log(arr3); // [0, 1, 2, 3, 4, 5, 6, 7, 8]
arr3[2] = 22;
arr3[5] = 55;
console.log(arr3); // [0, 1, 22, 3, 4, 55, 6, 7, 8]
console.log(arr1); // [1, 2, 3]
console.log(arr2); // [4, 5, 6]

展开操作创建了 arr1arr2 的一份浅拷贝。 它们不会被展开操作所改变。

展开对象

示例:

let obj = { name: "xiaoming", age: 12, sex: "man" };
let newObj = { ...obj, name: "xiaofang",  grade: 'six' };
newObj.age = 13
console.log(newObj) // {name: 'xiaofang', age: 13, sex: 'man', grade: 'six'}
console.log(obj) // {name: 'xiaoming', age: 12, sex: 'man'}

编译成js:

var __assign = (this && this.__assign) || function () {
    __assign = Object.assign || function(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
                t[p] = s[p];
        }
        return t;
    };
    return __assign.apply(this, arguments);
};
var obj = { name: "xiaoming", age: 12, sex: "man" };
var newObj = __assign({}, obj, { name: "xiaofang", grade: 'six' });
newObj.age = 13;
console.log(newObj); // {name: 'xiaofang', age: 13, sex: 'man', grade: 'six'}
console.log(obj); // {name: 'xiaoming', age: 12, sex: 'man'}

对象的展开比数组的展开要复杂的多。它也是从左至右进行处理,结果仍为对象。
如果有相同的属性,出现在展开对象后面的属性会覆盖前面的属性。

示例:

let obj = { name: "xiaoming", age: 12, sex: "man" };
let newObj = { name: "xiaofang", ...obj, grade: 'six' };
newObj.age = 13
console.log(newObj) // {name: 'xiaoming', age: 13, sex: 'man', grade: 'six'}
console.log(obj) // {name: 'xiaoming', age: 12, sex: 'man'}

编译成js:

var __assign = (this && this.__assign) || function () {
    __assign = Object.assign || function(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
                t[p] = s[p];
        }
        return t;
    };
    return __assign.apply(this, arguments);
};
var obj = { name: "xiaoming", age: 12, sex: "man" };
var newObj = __assign({ name: "xiaofang" }, obj, { grade: 'six' });
newObj.age = 13;
console.log(newObj); // {name: 'xiaoming', age: 13, sex: 'man', grade: 'six'}
console.log(obj); // {name: 'xiaoming', age: 12, sex: 'man'}

不过,对象展开有一些限制。它仅包含对象自身的可枚举属性。

当展开一个对象实例时,会丢失其方法。

示例:

class Student {
  count = 12;
  add() {
  }
}
let stu = new Student();
let cloneObj = { ...stu };
cloneObj.count; // 12
cloneObj.add(); // error!

报错:
请添加图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值