總目錄

從C#到TypeScript - 類型

TypeScript和C#一樣是微軟搞出來的,而且都是大牛Anders Hejlsberg領(lǐng)導(dǎo)開發(fā)的,它們之間有很多共同點(diǎn),現(xiàn)在嘗試以C#程序員的角度來理解下TypeScript。
TypeScript一門是JavaScript的超集語言,除了支持最新的JS語法外,TypeScript還會增加一些其他好用的語法糖,最重要的是它在兼顧JavaScript靈活的基礎(chǔ)上增加了強(qiáng)類型系統(tǒng),這樣更友好的支持開發(fā)大型系統(tǒng)。

現(xiàn)在來看下TypeScript基礎(chǔ)類型:

數(shù)值

C#的數(shù)字類型有好幾種:int, long, float, double, byte等,而TypeScript和JavaScript一樣,所有的數(shù)字都是浮點(diǎn)數(shù),都是用number表示,這樣也省了很了事,少了C#里類似long轉(zhuǎn)int overflow問題。

下面用不同進(jìn)制方式顯示數(shù)字20。

let num = 20;       // 10進(jìn)制let num = 0xa4;     // 16進(jìn)制let num = 0b10010;  // 2進(jìn)制let num = 0o24;     // 8進(jìn)制

布爾

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

let isCheck: boolean = true;

枚舉

enum,大家都知道javascript沒有enum,這也是TypeScript為此作的補(bǔ)充。功能上和C#差不多:

  1. 目的都是為數(shù)值提供一個(gè)友好的名字,增加代碼可讀性和可重構(gòu)性

  2. 默認(rèn)情況下從0開始編號

  3. 也可以手動賦值

  4. 可以實(shí)現(xiàn)類似C# Flag特性
    但也有一些細(xì)節(jié)不一樣:

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

  6. TypeScript可以通過數(shù)值下標(biāo)取得枚舉字符串值

enum Action{
    add = 1,
    edit = 2,
    del = 4,
    all = add | edit | del
}console.info(Action.add);  // 返回1console.info(Action.add.toString());  // 返回1console.info(Action[1]);  // 返回"add"console.info(Action[3]);  // 返回undefinedconsole.info(Action.all); // 返回7console.info(Action.all & Action.add) //返回1

上面的Action編譯成JavaScript的結(jié)果:

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的超集,所以當(dāng)然也支持單引號。
C#6.0里的模板字符串語法糖$"this is {name}'s blog"在TypeScript里也有類似的支持,當(dāng)然,這也是ES6的規(guī)范。

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

Symbol

這也是ES6的特性,用來當(dāng)作唯一的標(biāo)識,所有新建出來的Symbol都是不同的,不管傳進(jìn)去的值是否一樣。
Symbol非常適合做唯一key。

let key1 = Symbol('key');let key2 = Symbol('key');console.info(key1 === key2); // return false

any

這個(gè)和C#的dynamic很相似,可以代表任何東西且在上面調(diào)用方法或?qū)傩圆粫诰幾g時(shí)期報(bào)錯,當(dāng)然也本來就是JavaScript最基本的東西。

let test: any = 'test';
test = false;

test.test(); //編譯時(shí)期不會有報(bào)錯let arr: any[] = ['test', false];

void、null、undefined和never

void和C#的一樣,表示沒有任何東西。
nullundefined和JavaScript一樣,分別就是它們自己的類型,個(gè)人覺得這兩者功能有點(diǎn)重合,建議只使用undefined。
never是TypeScript引進(jìn)的,個(gè)人覺得是一種語義上的類型,用來表示永遠(yuǎn)不會得到返回值,比如while(true){}throw new Error()之類。

function test(): void{} //  voidlet a: string = null; let b: null = null; // null有自己的類型,并且默認(rèn)可以賦值給任何類型(除never之外),可用--strictNullChecks標(biāo)記來限制這個(gè)功能let a: string = undefined;  let b: undefined = undefined; // undefined, 同上function error(): never{ // never
    throw new Error('error');
}

數(shù)組

有基本的數(shù)組:

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

也有類似C#的泛型List

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

數(shù)組功能沒C#配合linq那么強(qiáng)大,不過配合其他一些庫如lodash也可以很方便的進(jìn)行各種操作。
數(shù)組還可以利用擴(kuò)展操作符...來把數(shù)組解開再放入其他數(shù)組中。

let arr: number[] = [1, 2, 3];let newArr: number[] = [...arr, 4, 5];console.info(newArr); // 1, 2, 3, 4, 5

元組

C#也有個(gè)雞肋的Tuple,不好用,不過新版的Tuple好像已經(jīng)在C#7.0的計(jì)劃當(dāng)中。
下面這段代碼是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#,不過叫法上是分開的,這里的元組只是對數(shù)組的處理,另外還有對象上的叫解構(gòu)賦值,以后會寫。

let tuple: [number, string] = [123, '456'];let num = tuple[0]; //numlet str = tuple[1]: //stringtuple[3] = '789'; //可以,越界后會以聯(lián)合類型來判斷,后面會講聯(lián)合類型tuple[4] = true; //不行

這一篇主要就講這些基本類型,下一篇會講TypeScript的高級類型。

http://www.cnblogs.com/brookshi/p/6361792.html