基礎(chǔ)語法
ts程序組成部分
模塊、函數(shù)榛斯、變量蔓钟、語句和表達(dá)式永票、注釋
一些注意
- ts會忽略程序中的空格、制表符和換行符
- ts區(qū)分大小寫
- 分號可選滥沫,建議使用
- 注釋與js相同
- ts是一種面向?qū)ο蟮木幊陶Z言
基礎(chǔ)類型
ts包含的數(shù)據(jù)類型
any - 任意類型:聲明為any的變量可以賦予任意類型的值
number - 數(shù)字類型
string - 字符串類型
boolean - 布爾類型
元素類型[] - 數(shù)組類型
????let arr: number[] = [1, 2]
Array<元素類型> - 數(shù)組類型(使用數(shù)組泛型)?
????let arr: Array<number> = [1, 2]
[元素類型1, 元素類型2, ...] - 元組類型:元組類型用來表示已知元素數(shù)量和類型的數(shù)組侣集,各元素的類型不必相同,但對應(yīng)位置上但類型需要相同兰绣。
? ? let x: [string, number];
? ? x = ['string', 1];? ? // 正常運行
? ? x = [1, 'string'];? ? //? 報錯
enum - 枚舉:枚舉類型用于定義數(shù)值集合
? ? enum Color {Red, Green, Blue};
? ? let c: Color = Color.Blue;
? ? console.log(c);? ?// 2
void - void:用于標(biāo)識方法返回值的類型世分,表示該方法沒有返回值
? ? function hello(): void {
? ? ? ? alert('Hello World!')
????}
null - null:表示對象值缺失
undefined - undefined:用于初始化變量為一個未定義的值
never - never:never是其他類型(包括null和undefined)的子類型,代表從不會出現(xiàn)的值
Any 類型
任意值是TypeScript針對編程時類型不明確的變量使用的一種數(shù)據(jù)類型缀辩,它常用于以下三種情況:
1 - 變量的值會動態(tài)改變時臭埋,比如來自用戶的輸入,任意值類型可以讓這些變量跳過編譯階段的類型檢查
2 - 改寫現(xiàn)有代碼時臀玄,任意值允許在編譯時可選擇地包含或移除類型檢查
3 - 定義存儲各種類型數(shù)據(jù)的數(shù)組時
Null 和Undefined
null
在JavaScript中null表示“什么都沒有”
在TypeScript中null時一個只有一個值的特殊類型瓢阴,表示一個空對象引用。
用typeof檢測null返回是object健无。
undefined
在JavaScript中荣恐,undefined是一個已聲明但未賦值的變量。
Null和Undefined是其他任何類型(包括void)的子類型累贤,可以賦值給其他類型叠穆,如數(shù)字類型,此時畦浓,賦值后的類型會變成null或undedined痹束。
而在TypeScript中啟用嚴(yán)格的空校驗(--strictNullChecks)特性,就使得null和undefined只能被賦值給void或本身對應(yīng)的類型讶请。
never類型
never是其他類型的子類型祷嘶,代表從不會出現(xiàn)的值屎媳。這意味著聲明為never類型的變量只能被never類型所賦值,在函數(shù)中它通常表現(xiàn)為拋出異陈畚。或無法執(zhí)行到終止點(例如無限循環(huán))
變量聲明
ts變量聲明
ts變量的命名規(guī)則與js變量的命名規(guī)則相同
變量不要使用name否則會與DOM中的全局window對象下的name屬性出現(xiàn)重名
ts是強(qiáng)類型語言烛谊,如果將不同的類型賦值給變量會編譯錯誤
類型斷言
類型斷言可以用來手動制定一個值的類型,即允許變量從一種類型更改為另一種類型嘉汰。
類型推斷
當(dāng)類型沒有給出時丹禀,TypeScript編譯器利用類型推斷來推斷類型。
如果由于缺乏聲明而不能推斷出類型鞋怀,那么它的類型被視作默認(rèn)的動態(tài)的any類型双泪。
let num = 2;? ?// 類型推斷為 number
num = '2';? ?// 編譯錯誤
編譯錯誤原因:第一行代碼num的類型已被推斷為number了,不能再將字符型賦值給num密似。
變量作用域
全局作用域
類作用域 - 這個變量也可稱為字段焙矛。類變量聲明在一個類里,但在類的外面残腌,該變量可以通過類的對象來訪問村斟。類變量也可以是靜態(tài)的,靜態(tài)的變量可以通過類名直接訪問抛猫。
局部作用域
函數(shù)
函數(shù)返回值
function 函數(shù)名(): 返回值類型 {}
帶參數(shù)函數(shù)
function 函數(shù)名( 參數(shù)1: 參數(shù)1的類型, 參數(shù)2: 參數(shù)2的類型, ... ) {}
可選參數(shù)
function 函數(shù)名( 參數(shù)?: 參數(shù)類型 ) {} - 在形參后加上?蟆盹,該參數(shù)即作為可選參數(shù)
默認(rèn)參數(shù)
function 函數(shù)名( 參數(shù): 參數(shù)類型 = 默認(rèn)值 ) {}
剩余參數(shù)
當(dāng)我們不知道要向函數(shù)傳入多少個參數(shù)時,可以使用剩余參數(shù)來定義闺金。
function 函數(shù)名( ...參數(shù)數(shù)組: 數(shù)組類型 ) {}
Lambda函數(shù)(箭頭函數(shù))
let 變量名 = (參數(shù): 參數(shù)類型) => {}
參數(shù)可不指定類型逾滥,通過函數(shù)內(nèi)來推斷參數(shù)類型
函數(shù)重載
重載就是方法名字相同,而參數(shù)不同掖看,返回類型可以相同也可以不同匣距。
每個重載的方法(或構(gòu)造函數(shù))都必須有一個獨一無二的參數(shù)類型列表面哥。
* 如果參數(shù)類型不同哎壳,則參數(shù)類型應(yīng)設(shè)置為any
* 如果參數(shù)數(shù)量不同,則可以將不同的參數(shù)設(shè)置為可選
TypeScript Number
Number 對象屬性
MAX_VALUE:可表示的最大的數(shù)尚卫,MAX_VALUE屬性值接近于 1.79E+308归榕。大于MAX_VALUE的值代表“Infinity”
MIN_VALUE:可表示的最小的數(shù),即最接近 0 的正整數(shù)(實際上不會變?yōu)?0 )吱涉,MIN_VALUE的值約為 5e-324刹泄,小于MIN_VALUE的值將會轉(zhuǎn)換為 0 。最大的負(fù)數(shù)是 -MIN_VALUE怎爵。
NaN:非數(shù)字值
NEGATIVE_INFINITY:負(fù)無窮大特石,溢出時的返回值。該值小于MIN_VALUE鳖链。
POSITIVE_INFINITY:正無窮大姆蘸,溢出時的返回值。該值大于MAX_VALUE。
prototype:Number 對象的靜態(tài)屬性逞敷】袂兀可以向?qū)ο筇砑訉傩院头椒ā?/p>
constructor:返回對創(chuàng)建此對象的Number函數(shù)的引用。
Number 對象方法
toExponential() :把對象的值轉(zhuǎn)為指數(shù)計數(shù)法
toFixed() : 把數(shù)字轉(zhuǎn)換為字符串推捐,并可指定小數(shù)點的位數(shù)
toLocaleString() : 把數(shù)字轉(zhuǎn)換為字符串裂问,使用本地數(shù)字格式順序
toPrecision() : 把數(shù)字格式轉(zhuǎn)為指定的長度
toString() :把數(shù)字轉(zhuǎn)換為字符串,使用指定的基數(shù)牛柒。數(shù)字的基數(shù)是2~36之間的整數(shù)堪簿。若省略該參數(shù),則使用基數(shù)10.
valueOf() :返回一個Number對象的原始數(shù)字值
TypeScript String
String 對象屬性
length
prototype
constructor
String 對象方法
localeCompare() - 用本地特定對順序來比較兩個字符串 - 相同返回0 不同返回-1
TypeScript Array(數(shù)組)
聲明數(shù)組的語法格式
let array_name [:datatype];? ?// 聲明
array_name = [val1, val2, val3, ...];? ?// 初始化
let array_name [:datatype] = [val1, val2, val3, ...];? ?// 直接在聲明時初始化
*如果數(shù)組聲明時未設(shè)置類型皮壁,則會被認(rèn)為時any類型戴甩,在初始化時根據(jù)第一個元素的類型來推斷數(shù)組的類型。
Array 對象
Array 對象的構(gòu)造函數(shù)接受兩種值:
表示數(shù)組大小的數(shù)值
初始化的數(shù)組列表 元素使用逗號隔開
數(shù)組結(jié)構(gòu)
let arr:number[] = [1, 2];
let [num1, num2] = arr
// num1 = 1, num2 = 2
數(shù)組迭代
for ... in
多維數(shù)組
let arr_name:datatype[] []
數(shù)組方法
reduce() - 將數(shù)組元素計算為一個值(從左到右)
reduceRight() - 將數(shù)組元素計算為一個值(從右到左)
TypeScript 元組
創(chuàng)建元組
let tuple_name = [val1, val2, val3, ...]
元組運算
push() - 向元組尾部添加元素
pop() - 從元組尾部移除元素闪彼,并返回移除的元素
結(jié)構(gòu)元組
let tup = ['a', 1];
let [a, b] = tup;
// a = 'a', b = 1
TypeScript 聯(lián)合類型
聯(lián)合類型可以通過管道將變量設(shè)置多種類型甜孤,賦值時可以根據(jù)設(shè)置的類型來賦值。
*只能賦值指定的類型
聯(lián)合類型 格式
datatype1 | datatype2 | datatype3 | ...
TypeScript 接口
定義接口
interface interface_name {}
接口和數(shù)組
接口中我們可以將數(shù)組的索引值和元素設(shè)置為不同類型畏腕,索引值類型可以是數(shù)字或字符串缴川。
接口繼承
單接口繼承:Child_interface_name extends super_interface_name
多接口繼承:Child_interface_name extends super_interface1_name, super_interface2_name, ...
TypeScript 類
類的模塊(類的數(shù)據(jù)成員)
字段 - 類里面聲明的變量,表示對象的有關(guān)數(shù)據(jù)
構(gòu)造函數(shù) - 類實例化時可調(diào)用描馅,可以為類的對象分配內(nèi)存
方法 - 對象要執(zhí)行的操作
類的繼承
子類不能繼承父類的私有成員(方法和屬性)和構(gòu)造函數(shù)把夸。
一次只能繼承一個類,不支持繼承多個類铭污,但支持多重繼承(A繼承B恋日,B繼承C)。
語法:class child_class_name extends parent_class_name
static 關(guān)鍵字
static 關(guān)鍵字用于定義類的數(shù)據(jù)成員(屬性和方法)為靜態(tài)的嘹狞,靜態(tài)成員可以直接通過類名調(diào)用岂膳。
instanceof 運算符
instanceof 運算符用于判斷對象是否是指定的類型,如果是返回true磅网,否則返回false谈截。
訪問控制修飾符
TypeScript中,可以使用訪問控制符來保護(hù)對類涧偷、變量簸喂、方法和構(gòu)造方法的訪問。
支持三種不同的訪問權(quán):
public(默認(rèn)) - 公有 可以在任何地方被訪問
protected - 受保護(hù) 可以被其自身以及其子類和父類訪問
private - 私有 只能被其定義所在的類訪問
類和接口
類可以實現(xiàn)接口燎潮,使用關(guān)鍵詞 implements喻鳄,可將接口字段作為類的屬性使用。
TypeScript 對象
TypeScript 類型模板
TypeScript 中的對象必須是特定類型的實例确封。
在JavaScript中如果需要在對象中添加方法除呵,可以直接 object.方法名 = ... 添加唉锌,但是在TypeScript中使用該方法會出現(xiàn)編譯錯誤,因為TypeScript 中的對象必須是特定類型的實例竿奏。
TypeScript 命名空間
命名空間定義了標(biāo)識符的可見范圍袄简,一個標(biāo)識符可在多個名字空間中定義,它在不同名字空間中的含義是互不相關(guān)的泛啸。
命名空間使用 namespace 來定義绿语。
如果需要在外部調(diào)用命名空間內(nèi)的標(biāo)識符,需要在標(biāo)識符前添加 export 關(guān)鍵詞候址。
舉例:
? ? namespace 命名空間名字 {
? ? ? ? export interface 接口名 {}
? ? ? ? export class 類名 {}
? ? ? ? ... ...
????}
要在另一個命名空間調(diào)用 語法格式為:需要被調(diào)用的標(biāo)識符所在命名空間.標(biāo)識符
如果一個命名空間在另一個TypeScript文件中吕粹,則需要使用三斜杠 /// 引用它。
? ? /// <reference path = "SomeFileName.ts" />
TypeScript 模塊
模塊的導(dǎo)入導(dǎo)出
export 導(dǎo)出 import 導(dǎo)入
? ? 舉例:
? ? 導(dǎo)出文件名:SomeInterface.ts?
? ? 導(dǎo)出代碼:export interface SomeInterface { }
? ? 導(dǎo)入代碼:import someInterfaceRef = require("./SomeInterface")