从C#到TypeScript - 类型javascript
从C#到TypeScript - 接口typescript
TypeScript的变量声明和ES6差很少,相比以前主要是多了let
和const
不论是TypeScript仍是ES6都会兼容之前的javascript,因此在TypeScript里var
也仍是保留了。
虽然C#里也有var
,但和JavaScript的可不同,var
在javascript里会有一些奇怪的表现,好比会置前,并且做用域是整个函数,能够不写var
来声明变量,而后变量变成全局。
这些均可能会带了一些不容易注意到的问题。
好比经典的:
for (var i = 0; i < 10; i++) { setTimeout(function() { console.info(i); }, 100); }
结果并非指望的0, 1, 2, 3...,跑出来的结果全是10,这是由于var
出来的i
的做用域是整个函数。
这就致使循环完成后i
变成10,setTimeout
内的函数才被执行,因此结果都是10了。
虽然能够用当即完成函数把从新构建一个做用域,但毕竟用起来麻烦,并且不符合人的思惟,因此就有了let
。
let
主要是对var
的一个代替,用let
更符合人思考的过程,这才和C#var
的功能是差很少。
let
的用法和var
是同样的:
let str = 'string';
let的做用域是块级做用域,好比上面的循环,用let
声明i
的话就可心获得指望的值
for (let i = 0; i < 10; i++) { setTimeout(function() { console.info(i); }, 100); }
这里获得的结果就是0, 1, 2....9。
因此建议仍是抛弃var
,选择let
。
C#也有const,意义上差很少,都是常量,不想变量被改变。
const str = 'string'; str = 'new string'; // 编译不了
通常状况下,主张肯定不变的变量用const
声明来增长代码健壮性和可读性。
所谓解构,就是把对象或数组里的成员分解出来。
好比数组:
let [first, second] = [1, '2', false]; console.info(`first: ${first}`);
这里就把数组的第一个成员和第二个成员分别用first
和second
解构出来,就省去了分别声明两个变量,并用下标取数组里的值来赋值了。
这也能够方便的提供一些功能,好比交换数组里的两个值,按之前的作法须要借助下中间变量,如今就不须要了:
let [first, second] = [second, first];
能够利用...
扩展符号来解开数组,再并入其余数组。
let arr = [1, 2, 3]; let newArr = [...arr, 4, 5]; console.info(newArr); // 1, 2, 3, 4, 5
对象一样能够被解构:
class Test{ str = "string"; int = 1; bool = false; func(){ console.info('func'); } } let {str, bool, func} = new Test(); //名字必须和类里的保持一致 let {str: newStr} = new Test(); //经过这种方式能够把str改成newStr console.info(`${str}, ${bool}`); func();
...
符号一样能够用于对象,不过只能解开可枚举的变量,因此函数不会解出来。
延用上面的class:
let {str, ...other} = new Test(); console.info(other.int); // 输出1 console.info(other.func()); // 编译错误,...符号不能解出函数
还能够加上默认值,当解出来的值是undefined
时会用上默认值
class Test{ empty; str = ''; } let {empty='empty', str='str'} = new Test(); console.info(`${empty}, ${str}`); // 输出 empty, ,由于str有值,因此用原始的''
以上就是经常使用的变量声明及赋值的使用方法,不过基本都是ES6的标准语法,TypeScript自己并无在上面多作什么。