引入
為了項目的實(shí)用性,我們需要幾種最簡單的數(shù)據(jù)單元: number, string, structures, boolean, 以及等等.
在typescript中,語言支持的數(shù)據(jù)類型和javascript幾乎一致,它額外包含一些方便的枚舉類型.
boolean
最基本的數(shù)據(jù)類型是簡單的 true/false值, js 和ts 稱之為 boolean 值
let isDone: boolean = false
number
和js一樣,ts中所有的數(shù)字都是浮點(diǎn)類型, 這些浮點(diǎn)類型的數(shù)字稱為number類型
在16進(jìn)制和10進(jìn)制的基礎(chǔ)上,ts同時支持2進(jìn)制和8進(jìn)制寫法(這一特性由es6引入)
let decimal: number = 6;
let hex:number = 0xf00d
let binary: number = 0b1010
let octal: number = 0o744
string
和其他語言一樣,我們使用string 類型來表達(dá)文本數(shù)據(jù).和js一樣,ts同樣使用雙引號或者單引號來表示string數(shù)據(jù)
let color: string = 'blue';
name = "red"
你同樣能使用模板字符串(支持多行和嵌入表達(dá)式, 參見es6 模板字符串),用(`)來表示,使用時的格式: ${expr}
let fullname: string = `bob bobbington`;
let age: number = 37;
let sentence: string = `hello, my name is ${fullname}.
i 'll be ${age + 1} years old next month`
這和下面的表達(dá)式輸出相同:
let sentence : string = "Hello, my name is " + fullname + ".\n\n" + "I'll be " + (age + 1) + " years old next month."
array
ts和js一樣,支持?jǐn)?shù)組類型,數(shù)組類型有兩種寫法:
- 第一種:
let list: number[] = [1, 2, 3]
- 第二種: 這是更一般的數(shù)組寫法,
let list: Array<number> = [1, 2, 3]
tuple
tuple類型允許你表達(dá)復(fù)合類型的'數(shù)組',例如string和number類型的組合:
//declare a tuple type
let x: [string, number];
x = ['hello', 10]; //ok
x = [10, 'hello']; //error
這時要注意:
當(dāng)調(diào)用某些特定數(shù)據(jù)類型的方法時,需要檢測tuple當(dāng)前index 的數(shù)據(jù)類型
console.log(x[0].substr(1)); //ok
console.log(x[1].substr(1)); //error, 'number' does not have 'substr'
有意思的特性:當(dāng)操作那些超過已知索引的元素時,這時它的數(shù)據(jù)類型可以看作是union type
x[3] = 'world' //ok, (string|number)
console.log(x[5].toString()) //ok, 'string' 和 'number'都有 toString 方法
x[6] = true //error, boolean isn't in (string | number)
union類型在后續(xù)的章節(jié)中還會有深入研究
enum
一個對js數(shù)據(jù)類型標(biāo)準(zhǔn)很有幫助的擴(kuò)充, 和 c# 語言一樣, enum類型提供了一種方式來對數(shù)值設(shè)置更友好的命名
enum Color {red, green, blue};
let c: Color = Color.green;
默認(rèn)情況下, enum 從 0 開始對它的成員計數(shù), 然而你可以手動的對某一成員進(jìn)行更改
一個例子:
enum Color {red = 1, green, blue};
let c: Color = Color.green
甚至可以手動的設(shè)置enum里每一個值:
enum Color {red = 1, green = 2, blue = 4};
let c: Color = Color.green
enum類型一個便利的特征是: 你能夠通過這些數(shù)字索引來獲取enum里這些成員的值.
一個例子:
enum color {red = 1, green, blue}
let colorName: string = color[2]
alert(colorName) //green
any
我們也許會碰到這樣的情況: 當(dāng)我們在寫一個應(yīng)用,并需要描述一個我們并不知道的變量的類型. 例如來自于第三方庫或使用者,在這種情況下,我們想要選擇性的去掉類型檢查以及讓變量通過編譯時的檢查,為了上述目的, 我們把這些變量定義為 any
類型:
let notSure: any =4;
notSure = "maybe a string instead";
notSure = false; //ok
在當(dāng)前的js環(huán)境中 any 類型是一種強(qiáng)有力的工具, 允許你在編譯期選擇性的加入和去掉變量類型檢查.你也許會想到 object類型也扮演著相似的角色,就像其他語言中一樣.但是object類型的變量只允許你對它賦任何值---你不能調(diào)用這些數(shù)據(jù)類型的任意方法,即使這些方法確實(shí)存在
let notSure : any = 4;
notSure.ifItExists(); //ok, function may exist at runtime
notSure.toFixed(); //ok, toFixed exists ,Number 四舍五入為指定小數(shù)位數(shù)的數(shù)字。
let prettySure: Object = 4;
prettySure.toFixed() //error, property "toFixed" doesn't exist on type 'object'
在這種情況下any 類型是非常便利的: 你知道某一部分類型, 但是并不知道全部.例如, 一個數(shù)組擁有混合的數(shù)據(jù)類型;
let list: any[] = [1, true, 'free'];
list[1] = 100;
void
void 有點(diǎn)像any類型的對立面: 無類型. 你經(jīng)常會在函數(shù)的返回類型里看到它: 無返回類型(類似于c++)
function warnUser(): void {
alert('this is my some message')
}
聲明變量類型為void 是無效的,因為你僅僅只能給他賦值 undefined 或null
let a: void = undefined
type assertions(類型聲明)
關(guān)于某些變量, 有時我們會比ts知道的更多,通常這發(fā)生在:我們知道某些實(shí)體變量的類型比它當(dāng)前的類型更特殊
類型聲明意味著一種途徑來告訴編譯器: '相信我, 我知道我正在做什么'. 類型聲明就像其他語言中的類型拋出一樣, 但是在檢查或重構(gòu)數(shù)據(jù)時并不會表現(xiàn)什么不同. 它僅僅被編譯器使用.ts假設(shè)你已經(jīng)做了任何需要的類型檢查.
類型聲明有兩種語法格式, 一種被稱為 'angle-bracket' 語法:
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
兩種語法是等價的,使用哪一種完全取決于你的代碼風(fēng)格: 然而,當(dāng)你同時使用JSX時, 只有'as' 語法被支持
關(guān)于let 變量
你也許已經(jīng)注意到了,我們一直在使用let 關(guān)鍵字來代替js中的var 關(guān)鍵字.let關(guān)鍵字實(shí)際上定義了一種新的js結(jié)構(gòu)(ts同樣支持,由es6引入).以前js中許多常見的問題都能夠通過使用let 來避免. 因此 放棄使用var, 用let來完全取代它吧~~