總目錄
從C#到TypeScript - 類型
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#差不多:
- 目的都是為數值提供一個友好的名字,增加代碼可讀性和可重構性
- 默認情況下從0開始編號
- 也可以手動賦值
- 可以實現類似C# Flag特性
但也有一些細節不一樣: - C#的枚舉值
toString()
會返回枚舉的文本值,而TypeScript是數值 - 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; //不行
這一篇主要就講這些基本類型,下一篇會講TypeScript的高級類型。