今天也好喜歡你啊。
寫這篇的時(shí)候,也滿腦子的你。
2020/02/18
一
1.TypeScript 只會進(jìn)行靜態(tài)檢查,如果發(fā)現(xiàn)有錯(cuò)誤,編譯的時(shí)候就會報(bào)錯(cuò),但仍會生成js文件
如果要在報(bào)錯(cuò)的時(shí)候終止 js 文件的生成,可以在 tsconfig.json 中配置 noEmitOnError 即可
二
1.JavaScript 的類型分為兩種:原始數(shù)據(jù)類型和對象類型。
原始數(shù)據(jù)類型包括:布爾值、數(shù)值、字符串、null、undefined 以及 ES6 中的新類型 Symbol。
在 TypeScript 中,boolean 是 JavaScript 中的基本類型,而 Boolean 是 JavaScript 中的構(gòu)造函數(shù)。其他基本類型(除了 null 和 undefined)一樣
eg:
let isDone: boolean = false; 編譯通過
let createdByNewBoolean: boolean = new Boolean(1);或者 let createdByNewBoolean: Boolean = new Boolean(1);? 編譯不通過,因?yàn)榉祷氐氖且粋€(gè) Boolean 對象
2.Void、undefined 和 null
在 TypeScript 中,可以用 void 表示沒有任何返回值的函數(shù);
聲明一個(gè) void 類型的變量沒有什么用,因?yàn)槟阒荒軐⑺x值為 undefined 和 null;
undefined 和 null 是所有類型的子類型。也就是說 undefined ?和 null類型的變量,可以賦值給其他變量;void不行
eg:
let num: number = undefined; 編譯通過
3.any類型
允許被賦值為任意類型;
變量如果在聲明的時(shí)候,未指定其類型,那么它會被識別為任意值類型;
eg:
let something;
something = 'seven';
something = 7;? 編譯通過,因?yàn)轭愋屯普搶omething認(rèn)為any
eg:
let myFavoriteNumber = 'seven';
myFavoriteNumber = 7;? 編譯不通過,因?yàn)轭愋屯普搶yFavoriteNumber認(rèn)為string
4.聯(lián)合類型
當(dāng)不確定一個(gè)聯(lián)合類型的變量到底是哪個(gè)類型的時(shí)候,我們只能訪問此聯(lián)合類型的所有類型里共有的屬性或方法
eg:
let myFavoriteNumber: string | number;
5.interface
它是對行為的抽象,而具體如何行動需要由類(classes)去實(shí)現(xiàn)(implement);接口一般首字母大寫;
一旦定義了任意屬性,那么確定屬性和可選屬性都必須是它的子屬性
eg:
interface Person {
? ? name: string;
? ? age?: number;
}
name屬性必須有,age可以沒有,除了這兩個(gè)不允許有其他屬性。
eg:
interface Person{
? ? name: string;
? ? age?: number;
? ? [propName: string]: any;
}
使用 [propName: string] 定義了任意屬性取 string 類型的值。
let tom: Person = {
? ? name: 'Tom',
? ? gender: 'male'
};
eg:
interface Person {
? ? readonly id: number;
? ? name: string;
? ? age?: number;
? ? [propName: string]: any;
}
let tom: Person = {
? ? id:1,
? ? name: 'Tom',
? ? gender: 'male'
};
只讀屬性在第一次給對象賦值時(shí)也要賦值,只是后面不能修改
tom.id = 89757;? 會編譯失敗
6.數(shù)組(待續(xù))
數(shù)組: let fibonacci: number[] = [1, 1, 2, 3, 5];
數(shù)組泛型:? let fibonacci: Array<number> = [1, 1, 2, 3, 5];
7.函數(shù)
在 TypeScript 的類型定義中,=> 用來表示函數(shù)的定義,左邊是輸入類型,需要用括號括起來,右邊是輸出類型;
與ES6中的 => 完全不同
eg:
let mySum = function (x: number, y: number): number {
? ? return x + y;
};
與
let mySum: (x: number, y: number) => number = function (x: number, y: number): number {
? ? return x + y;
};
前者利用類型推論推斷出mySum的類型
允許可選參數(shù),用 “?”表示,但可選參數(shù)必須在必須參數(shù)之后
eg:
function buildName(firstName?: string, lastName: string) {
? ? ...
}
允許參數(shù)默認(rèn)值,TypeScript 會將添加了默認(rèn)值的參數(shù)識別為可選參數(shù);此時(shí)就不受「可選參數(shù)必須接在必需參數(shù)后面」的限制了
eg:
function buildName(firstName: string = 'Tom', lastName: string) {
? ...
}
剩余參數(shù),使用 “...rest”方式
eg:
function push(array, ...items) {
? ....
}
允許函數(shù)重載
TypeScript 會優(yōu)先從最前面的函數(shù)定義開始匹配,所以多個(gè)函數(shù)定義如果有包含關(guān)系,需要優(yōu)先把精確的定義寫在前面
8.斷言
當(dāng)不確定一個(gè)聯(lián)合類型的變量到底是哪個(gè)類型的時(shí)候,我們只能訪問此聯(lián)合類型的所有類型里共有的屬性或方法。此時(shí)可以使用類型斷言,將該變量“轉(zhuǎn)換”為聯(lián)合類型中的一個(gè);
斷言成一個(gè)聯(lián)合類型中不存在的類型是不允許的
eg:
function getLength(something: string | number): number {
? ?if ((<string>something).length) {
? ? ? ? return (<string>something).length;
? ? } else {
? ? ? ? return something.toString().length;
? ? }
}