JS的數(shù)據(jù)類型
JS的數(shù)據(jù)類型分為兩種:原始數(shù)據(jù)類型和對(duì)象類型
- 原始數(shù)據(jù)類型
- 布爾值料睛、數(shù)值丐箩、字符串、null恤煞、undefined以及ES6新增的Symbol
- 對(duì)象類型
- object屎勘、array、function
布爾值
let isDone: boolean = false
數(shù)字
和JavaScript一樣居扒,ts里的所有數(shù)字都是浮點(diǎn)數(shù)概漱,類型為number,支持十進(jìn)制喜喂、二進(jìn)制瓤摧、八進(jìn)制、十六進(jìn)制
let num1: number = 1
let num2: number = OB11
字符串
與JS一樣玉吁,用""
或者''
表示字符串
也可以使用字符串模板
let name = 'zink'
let str: string = `my name is ${name}`
數(shù)組
定義數(shù)組的方式有兩種:
- 在元素類型后接上[]照弥,表示由此類型元素組成的一個(gè)數(shù)組
let arr: number[] = [1, 2, 3, 4]
- 第二種方式是使用數(shù)組泛類,Array<元素類型>:
let list: Array<number> = [1, 2, 3, 4]
元組 Tuple
元組類型允許表示一個(gè)已知元素?cái)?shù)量和類型的數(shù)組进副,各元素的類型不比相同这揣。比如:可以定義一對(duì)值分別為string
和number
類型的元組
let x: [string, number]
x = ['zink', 10] //ok
x = [10, 'zink'] //error
當(dāng)訪問(wèn)一個(gè)已知索引的元素,會(huì)得到正確的類型:
console.log(x[0].substr(1)) //ok
console.log(x[1].substr(1)) //error, 'number' dose not have 'substr'
枚舉
enum
類型是對(duì)JS標(biāo)準(zhǔn)數(shù)據(jù)類型的一個(gè)補(bǔ)充影斑,像C#等其他語(yǔ)言一樣给赞,使用枚舉類型可以為一組數(shù)組賦予友好的名字。
enum Color {Red, Green, Blue}
let c: Color = Color.Green
默認(rèn)情況下矫户,從0
開始為元素編號(hào)片迅。你也可以手動(dòng)的指定成員的數(shù)組。例如吏垮,我們將上面的例子改成從1開始編號(hào):
enum Color {Red = 1, Green, Blue}
let c: Color = Color.Green;
或者障涯,全部都采用手動(dòng)賦值:
enum Color {Red = 1, Green = 2, Blue = 4}
let c: Color = Color.Green;
枚舉類型提供的一個(gè)便利是你可以有枚舉的值得到它的名字。例如膳汪,我們知道數(shù)值為2唯蝶,但是不確定它映射到Color里的哪個(gè)名字,我們就可以查找相應(yīng)的名字:
enum Color {Red = 1, Green, Blue}
let colorName: string = Color[2];
console.log(colorName) //Green
Any
有時(shí)候遗嗽,我們會(huì)想要為那些暫時(shí)還不清除類型的變量指定一個(gè)類型粘我,這個(gè)值可能來(lái)自于動(dòng)態(tài)的內(nèi)容,比如來(lái)自用戶輸入或者第三方代碼庫(kù)。在這種情況下征字,我們不希望類型檢查器對(duì)這些值進(jìn)行檢查二食堂她們直接通過(guò)編譯階段的檢查都弹。那么我們可以使用any
類型來(lái)標(biāo)記這些變量:
let notSure: any = 4
notSure = 'zink'
notSure = true //ok
在對(duì)現(xiàn)有代碼進(jìn)行改寫的時(shí)候,any
類型是十分有用的匙姜,它允許你在編譯時(shí)可選擇地包含或移除類型檢查畅厢,你可能認(rèn)為Object
有相似的作用,就像他在其他語(yǔ)言中那樣氮昧。但是Object
類型的變量只是允許你給他賦任意值框杜,但是卻不能夠在它上面調(diào)用任意的方法,即便他真的有這些方法:
let notSure: any = 4
notSure.ifItExists() //ok
notSure.toFixed() //ok
let prettySure: Object = 4
prettySure.toFixed() //error
當(dāng)你只知道一部分?jǐn)?shù)據(jù)的類型時(shí)袖肥,any類型也是有用的咪辱。比如,你有一個(gè)數(shù)組椎组,它包含了不同的類型的數(shù)據(jù):
let list: any[] = [1, true, 'zink']
list[1] = 100
Void
某種程度上來(lái)說(shuō)油狂,void
類型像是與any
類型相反,它表示沒有任何類型寸癌。當(dāng)一個(gè)函數(shù)沒有返回值時(shí)专筷,你通常會(huì)見到其返回值類型是void
:
function warnUser(): void{
console.log('沒有返回值')
}
聲明一個(gè)void
類型的變量沒有什么大用,因?yàn)槟阒荒転樗x予undefined
和null
:
let unusable: void = undefined;
Null和Undefined
TS里蒸苇,undefined
和null
兩者各自有自己的類型分別叫做undefined
和null
仁堪。和void
相似,它們的本身的類型用處不是很大:
let u: undefined = undefined;
let n: null = null;
默認(rèn)情況下null
和undefined
是所有類型的子類型填渠。也就是說(shuō)你可以把null
和undefined
賦值給number
類型的變量弦聂。
Never
never
類型表示的是那些永不存在的值的類型。例如氛什,never
類型是那些總是會(huì)拋出異齿汉或者根本就不會(huì)有返回值的函數(shù)表達(dá)式或者箭頭函數(shù)表達(dá)式的返回值類型;變量也可能是never類型枪眉,當(dāng)它們被永不為真的類型保護(hù)所約束時(shí)捺檬。
never
類型是任何類型的子類型,也可以賦值給任何類型贸铜;然而堡纬,沒有類型是never的子類型或可以賦值給never
類型(除了never
本身之外)。 即使any
也不可以賦值給never
蒿秦。
// 返回never的函數(shù)必須存在無(wú)法達(dá)到的終點(diǎn)
function error(message: string): never {
throw new Error(message);
}
// 推斷的返回值類型為never
function fail() {
return error("Something failed");
}
// 返回never的函數(shù)必須存在無(wú)法達(dá)到的終點(diǎn)
function infiniteLoop(): never {
while (true) {
}
}
Object
object
表示非原始類型烤镐,也就是除number
,string
,boolean
,symbol
,null
,undefined
之外的類型。
使用object
類型棍鳖,就可以更好的表示像Object.create
這樣的API炮叶。例如:
declare function create(o: object | null): void;
create({ prop: 0 }); // OK
create(null); // OK
create(42); // Error
create("string"); // Error
create(false); // Error
create(undefined); // Error
類型斷言
覆蓋TS的類型推斷碗旅,并且以你任何想要的方式分析,這就是類型斷言
镜悉,TypeScript類型斷言用來(lái)告訴編譯器你比它更了解這個(gè)類型祟辟,并且它不應(yīng)該再發(fā)出錯(cuò)誤。
常見語(yǔ)法有兩種:
//<>語(yǔ)法
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;
//as語(yǔ)法
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;
當(dāng)你在TS中使用JSX時(shí)侣肄,只有as
語(yǔ)法斷言是被允許的