广西十一选五玩法|广西十一选五开奖查询
  • 從C#到TypeScript - 類型

    發布:51Code 時間: 2018-05-07 10:08

  • 最近遇到了這樣一個bug,發現當狀態欄改變(比如出現開啟熱點,另一個程序后臺獲取位置等)后,有些view會下移,而有些view不會下移,如果是底部的view下移后就會造成bug。于是我就...

  • TypeScript和C#一樣是微軟搞出來的,而且都是大牛Anders Hejlsberg領導開發的。

    它們之間有很多共同點,現在嘗試以C#程序員的角度來理解下TypeScript。

    TypeScript一門是JavaScript的超集語言,除了支持最新的JS語法外,TypeScript還會增加一些其他好用的語法糖。

    最重要的是它在兼顧JavaScript靈活的基礎上增加了強類型系統,這樣更友好的支持開發大型系統。

    現在來看下TypeScript基礎類型:

    數值

    C#的數字類型有好幾種:int, long, float, double, byte等。

    而TypeScript和JavaScript一樣,所有的數字都是浮點數,都是用number表示,這樣也省了很了事,少了C#里類似long轉int overflow問題。

    下面用不同進制方式顯示數字20。

    let num = 20;      // 10進制

    let num = 0xa4;    // 16進制

    let num = 0b10010;  // 2進制

    let num = 0o24;    // 8進制

    布爾

    boolean,和C#的功能一樣,不多說。

    let isCheck: boolean = true;

    枚舉

    enum,大家都知道javascript沒有enum,這也是TypeScript為此作的補充。

    功能上和C#差不多:

    1. 目的都是為數值提供一個友好的名字,增加代碼可讀性和可重構性

    2. 默認情況下從0開始編號

    3. 也可以手動賦值

    4. 可以實現類似C# Flag特性,但也有一些細節不一樣:

    5. C#的枚舉值toString()會返回枚舉的文本值,而TypeScript是數值

    6. TypeScript可以通過數值下標取得枚舉字符串值

    enum Action{

        add = 1,

        edit = 2,

        del = 4,

        all = add | edit | del

    }

    console.info(Action.add);  // 返回1

    console.info(Action.add.toString());  // 返回1

    console.info(Action[1]);  // 返回"add"

    console.info(Action[3]);  // 返回undefined

    console.info(Action.all); // 返回7

    console.info(Action.all & Action.add) //返回1

    上面的Action編譯成JavaScript的結果:

    var Action;

    (function (Action) {

        Action[Action["add"] = 1] = "add";

        Action[Action["edit"] = 2] = "edit";

        Action[Action["del"] = 4] = "del";

        Action[Action["all"] = 7] = "all";

    })(Action || (Action = {}));

    字符串

    字符串也基本和C#一樣,不過由于是JavaScript的超集,所以當然也支持單引號。

    C#6.0里的模板字符串語法糖$"this is {name}'s blog"在TypeScript里也有類似的支持,當然,這也是ES6的規范。

    let name: string = 'brook';

    let note: string = `this is ${name}'s blog`;

    Symbol

    這也是ES6的特性,用來當作唯一的標識,所有新建出來的Symbol都是不同的,不管傳進去的值是否一樣。

    Symbol非常適合做唯一key。

    let key1 = Symbol('key');

    let key2 = Symbol('key');

    console.info(key1 === key2); // return false

    any

    這個和C#的dynamic很相似,可以代表任何東西且在上面調用方法或屬性不會在編譯時期報錯,當然也本來就是JavaScript最基本的東西。

    let test: any = 'test';

    test = false;

    test.test(); //編譯時期不會有報錯

    let arr: any[] = ['test', false];

    void、null、undefined和never

    void和C#的一樣,表示沒有任何東西。

    null和undefined和JavaScript一樣,分別就是它們自己的類型,個人覺得這兩者功能有點重合,建議只使用undefined。

    never是TypeScript引進的,個人覺得是一種語義上的類型,用來表示永遠不會得到返回值,比如while(true){}或throw new Error()之類。

    function test(): void{} //  void

    let a: string = null; 

    let b: null = null; // null有自己的類型,

    //并且默認可以賦值給任何類型(除never之外),

    //可用--strictNullChecks標記來限制這個功能

    let a: string = undefined;  

    let b: undefined = undefined; // undefined, 同上

    function error(): never{ // never

       throw new Error('error');

    }

    數組

    有基本的數組:

    let arr: string[] = ['a', 'b', 'c'];

    也有類似C#的泛型List

    let list: Array<string> = ['a', 'b', 'c'];

    數組功能沒C#配合linq那么強大,不過配合其他一些庫如lodash也可以很方便的進行各種操作。

    數組還可以利用擴展操作符...來把數組解開再放入其他數組中。

    let arr: number[] = [1, 2, 3];

    let newArr: number[] = [...arr, 4, 5];

    console.info(newArr); // 1, 2, 3, 4, 5

    元組

    C#也有個雞肋的Tuple,不好用,不過新版的Tuple好像已經在C#7.0的計劃當中。

    下面這段代碼是C#7.0的,真方便,不用再new Tuple<>,item1, item2之類的。

    (string first, string middle, string last) LookupName(long id)

    {    

        return (first:'brook', middle:'', last:'shi');

    }

    var name = LookupName(id);

    console.WriteLine(`first:${name.first}, middle:${name.middle}, last:${name.last}`);

    TypeScript里的也不輸給C#,不過叫法上是分開的,這里的元組只是對數組的處理,另外還有對象上的叫解構賦值,以后會寫。

    let tuple: [number, string] = [123, '456'];

    let num = tuple[0]; //num

    let str = tuple[1]: //string

    tuple[3] = '789'; //可以,越界后會以聯合類型來判斷,后面會講聯合類型

    tuple[4] = true; //不行

    文章來源:網絡
    上文內容不用于商業目的,如涉及知識產權問題,請權利人聯系博為峰小編(021-64471599-8103),我們將立即處理。
  • 上一篇:沒有了

    下一篇:深入理解string和如何高效地使用string

網站導航
Copyright(C)51Code軟件開發網 2003-2020 , 滬ICP備05003035號-6
广西十一选五玩法 360比分直播足球 雷速体育app 广西十一选五 胜平负 球探棒球比分网 血战麻将怎么算胡 棒球比分多少结束 北京金隅新浪体育 江苏十一选五 北京单场足球指数