1. 程式人生 > WINDOWS開發 >C#碼農學TypeScript——基礎型別(2)

C#碼農學TypeScript——基礎型別(2)

學習每種語言,最開始都是型別。

下面做個表格,比較直觀看一看。

名稱 表示 取值 舉例 備註
布林值 boolean true/false
let isDone: boolean = false;
數字 number 十進位制、十六進位制、二進位制、八進位制
let decLiteral: number = 6;
let hexLiteral: number = 0xf00d;
let binaryLiteral: number = 0b1010;
let octalLiteral: number = 0o744;
TS裡所有數字都是浮點數
字串 string

雙引號""

單引號‘‘

模板字串``

let name: string = "bob";
let name: string = `Gene`;
let sentence: string = `Hello,my name is ${ name }. `;
陣列

元素型別後加[]

陣列泛型Array<元素型別>

let list: number[] = [1,2,3];
let list: Array<number> = [1,3];
元組Tuple
let x: [string,number];    // Declare a tuple type
x = [‘hello‘,10]; // Initialize it,OK x = [10,‘hello‘]; // Initialize it incorrectly,Error
表示一個已知元素數量和型別的陣列,各元素的型別不必相同。
列舉 enum
enum Color {Red = 1,Green,Blue}
let colorName: string = Color[2];

alert(colorName);  // 顯示‘Green‘因為上面程式碼裡它的值是2

為一組數值賦予友好的名字。

預設從0開始編號,可以手動賦值。

可以由數值取到它的名字。

任意值 any 任意值

不清楚型別,不希望型別檢查器對它檢查,直接通過編譯。

let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay,definitely a boolean

你可能認為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‘.

當你只知道一部分資料的型別時,any型別也是有用的。 比如,你有一個數組,它包含了不同的型別的資料:

let list: any[] = [1,true,"free"];

list[1] = 100;
空值 void

函式無返回值:

function warnUser(): void {
    alert("This is my warning message");
}

宣告一個void型別的變數沒有什麼大用,因為你只能為它賦予undefinednull

let unusable: void = undefined;
表示不是任何型別
Null和Undefined null和undefined null和undefined
// Not much else we can assign to these variables!
let u: undefined = undefined;
let n: null = null;

預設情況下nullundefined是所有型別的子型別。 就是說你可以把nullundefined賦值給number型別的變數。

有例外,指定--strictNullChecks標記時,只能賦值給void和它們各自。

Never never never

never型別是那些總是會丟擲異常或根本就不會有返回值的函式表示式或箭頭函式表示式的返回值型別; 變數也可能是never型別,當它們被永不為真的型別保護所約束時。

// 返回never的函式必須存在無法達到的終點
function error(message: string): never {
    throw new Error(message);
}

// 推斷的返回值型別為never
function fail() {
    return error("Something failed");
}

// 返回never的函式必須存在無法達到的終點
function infiniteLoop(): never {
    while (true) {
    }
}

never型別是任何型別的子型別,也可以賦值給任何型別;然而,沒有型別是never的子型別或可以賦值給never型別(除了never本身之外)。 即使any也不可以賦值給never

表示永不存在的值的型別。

型別斷言

類似C#型別轉換。

沒有執行時的影響,只在編譯階段起作用。使用型別斷言,相當於告訴編譯器“相信我,我知道自己在幹什麼,它就是這個型別,我比你清楚。”

有兩種語法形式,等價,憑個人喜好。

尖括號語法:

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;

JSX只能用as語法斷言。