從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自己並無在上面多作什麼。