基本數(shù)據(jù)類型

引入
為了項目的實(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來完全取代它吧~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钾埂,隨后出現(xiàn)的幾起案子甲锡,更是在濱河造成了極大的恐慌,老刑警劉巖顾复,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡荐绝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門避消,熙熙樓的掌柜王于貴愁眉苦臉地迎上來低滩,“玉大人,你說我怎么就攤上這事岩喷∷∧” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵纱意,是天一觀的道長婶溯。 經(jīng)常有香客問我,道長偷霉,這世上最難降的妖魔是什么迄委? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮类少,結(jié)果婚禮上叙身,老公的妹妹穿的比我還像新娘。我一直安慰自己硫狞,他們只是感情好信轿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著残吩,像睡著了一般财忽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上世剖,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天定罢,我揣著相機(jī)與錄音,去河邊找鬼旁瘫。 笑死祖凫,一個胖子當(dāng)著我的面吹牛琼蚯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惠况,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼遭庶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了稠屠?” 一聲冷哼從身側(cè)響起峦睡,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎权埠,沒想到半個月后榨了,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡攘蔽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年龙屉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片满俗。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡转捕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出唆垃,到底是詐尸還是另有隱情五芝,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布辕万,位于F島的核電站枢步,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蓄坏。R本人自食惡果不足惜价捧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涡戳。 院中可真熱鬧,春花似錦脯倚、人聲如沸渔彰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恍涂。三九已至,卻和暖如春植榕,著一層夾襖步出監(jiān)牢的瞬間再沧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工尊残, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炒瘸,地道東北人淤堵。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像顷扩,于是被迫代替她去往敵國和親拐邪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容