說明
本筆記是對TypeScript中文網站內容的學習記錄中姜,記錄一些重要的受扳,容易忘記的知識點华望。文中的TypeScript簡稱(TS)蓬戚, JavaScript簡稱(JS)
JavaScript數據類型
- undefined(未定義),
- null(空),
- boolean(布爾型),
- string(字符串),
- symbol(符號),
- number(數字),
- object(對象)
TypeScript基礎類型
JS支持的幢泼,TS基本都支持。而且還提供了 枚舉類型挥吵,以及any等丹允。枚舉 和 any比較重要的扇售。
枚舉
enum Color {Red, Green, Blue};
let c: Color = Color.Green;
enum Color {Red = 1, Green = 2, Blue = 4};
let c: Color = Color.Green;
enum Color {Red = 1, Green, Blue};
let colorName: string = Color[2];
alert(colorName);
跟其他語言的enum類似,使用方便靈活。
任意值 any、Object
JS中有Object, TS中有any
任意值背景
有時候岸更,我們會想要為那些在編程階段還不清楚類型的變量指定一個類型债查。 這些值可能來自于動態(tài)的內容,比如來自用戶輸入或第三方代碼庫。 這種情況下甚带,我們不希望類型檢查器對這些值進行檢查而是直接讓它們通過編譯階段的檢查。 那么我們可以使用 any類型來標記這些變量。
TS中的any
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean
JS中的Object
let notSure: Object = 4;
notSure = "maybe a string instead";
console.log(notSure);
notSure = false;
console.log(notSure);
差異
Object 和 any都可以達到上述要求。官網上有段描述:
在對現有代碼進行改寫的時候甜害,any
類型是十分有用的尔店,它允許你在編譯時可選擇地包含或移除類型檢查共螺。 你可能認為 Object有相似的作用,就像它在其它語言中那樣佳吞。 但是 Object類型的變量只是允許你給它賦任意值 - 但是卻不能夠在它上面調用任意的方法,即便它真的有這些方法:
let notSure: any = 4;
notSure.ifItExists(); // okay, ifItExists might exist at runtime
notSure.toFixed(); // okay, toFixed exists (but the compiler doesn't check)
let prettySure: Object = 4;
prettySure.toFixed(); // Error: Property 'toFixed' doesn't exist on type 'Object'.
上述Object在TS中是無法編譯通過的阱冶。
let listany: any[] = [1, true, "free"];
console.log(listany);
數組
定義數組, 2中方式
let list: number[] = [1,2,3]
let list: Array<number> = [1,2,3]
元組 Tuple
元組類型允許表示一個已知元素數量和類型的數組镊叁,各元素的類型不必相同。 比如惫皱,你可以定義一對值分別為 string和number類型的元組氢妈。
// Declare a tuple typelet
x: [string, number];
// Initialize it
x = ['hello', 10]; // OK
// Initialize it incorrectly
x = [10, 'hello']; // Error
問題
當訪問一個越界的元素,會使用聯(lián)合類型替代:
x[3] = 'world'; // OK, 字符串可以賦值給(string | number)類型
console.log(x[5].toString()); // OK, 'string' 和 'number' 都有 toString
x[6] = true; // Error, 布爾不是(string | number)類型
但是實操發(fā)現杠人,執(zhí)行
console.log(x[5].toString());
是不正確的勋乾,運行會提示 toString是undefined類型。修改為 x[3]是沒有任何問題的嗡善, 所以這里存在疑問辑莫。
空值 void
Null and Undefined
// Not much else we can assign to these variables!
let u: undefined = undefined
;let n: null = null;
//Null / Undefinedlet
number1: number = null;
//let number1: number = undefined;
console.log(number1);
但是,編譯的時候添加參數 --strictNullChecks
后罩引,就不能編譯通過了的各吨,是個好東西。
never
類型斷言
有時候你會遇到這樣的情況袁铐,你會比TypeScript更了解某個值的詳細信息揭蜒。 通常這會發(fā)生在你清楚地知道一個實體具有比它現有類型更確切的類型。
通過類型斷言這種方式可以告訴編譯器昭躺,“相信我忌锯,我知道自己在干什么”。 類型斷言好比其它語言里的類型轉換领炫,但是不進行特殊的數據檢查和解構偶垮。 它沒有運行時的影響,只是在編譯階段起作用帝洪。 TypeScript會假設你似舵,程序員,已經進行了必須的檢查葱峡。
類型斷言有兩種形式砚哗。 其一是“尖括號”語法:
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;
另一個為as語法:
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;
OMOP:個人覺得 as 使用 順手, 并且砰奕,你要是使用JSX蛛芥, 只有as語法斷言是允許的提鸟。