#1 typescript基礎(chǔ)知識

一.interface

一般情況: 不允許多屬性也不允許少屬性

interface Person {
  name: string,
  age: number
}

let james: Person {
  name: 'james'
} // 錯誤, 少了age屬性

let james: Person {
  name: 'james'
  age: 27,
  job: 'bricks diliver'
} // 錯誤躯畴, 多了屬性

如果想要某個屬性可選尊惰,可用 ?

interface Person {
  name: string,
  age?: number // 變?yōu)榭蛇x
}

let james: Person {
  name: 'james'
} // 沒毛病 老鐵

let james: Person {
  name: 'james'
  age: 27,
  job: 'bricks diliver'
} // 錯誤娄帖, 可以少屬性瘦材, 多了屬性依然報錯

任意屬性使用 [propName: string]: any(當然這里這個屬性限制為了字符串)

interface Person {
  name: string,
  age?: number,
  [propName: string]: any
}

let james: Person {
  name: 'james'
  age: 27,
  job: 'bricks diliver'
} // ok

只讀屬性使用 readonly: 只讀的約束在于第一次給對象賦值的時候熬芜,而不是第一次給只讀屬性賦值的時候

interface Person {
  readonly id: number,
  name: string,
  age?: number,
  [propName: any]: any;
}

let james: Person = {
  id: 10086, // 初始化賦值
  name: 'james'
} // ok

james.id = 10010; // 錯誤,只讀屬性不能賦值 

二.數(shù)組和類數(shù)組

數(shù)組的表示方式有以下幾種:

// 普通形
let arr: number[] = [1, 2, 3]
let arr: (number | string)[] = [1, 'james']

// 泛型 Array<elemType>
let genericArr: Array<number> = [1, 2, 3]

// 使用接口描述數(shù)組
interface NumberArr {
  [index: number]: number // 表示只要 'index' 的類型是 number, 那么值的類型必須是 number
}

let someNumArr: NumberArr = [1, 2, 3]

類數(shù)組不是數(shù)組類型,一般類數(shù)組都有自己的接口類型无切,如 IArguments, NodeList, HTMLCollection等等

function sum() {
  let args: IArguments = arguments;
}

三.函數(shù)類型

一般寫法:

// 寫法1
function sum(a: number, b: number): number {
  return a + b;
}
// 傳入的參數(shù)過少或過多或類型不符都會報錯
sum(10) // error
sum(10, 20, 30) // error

let sum = function(a: number, b: number): number {
  return a + b;
}

函數(shù)表達式

let mySum: (a: number, b: number) => number = function(a: number, b: number): number {
  return a + b;
}

// 或
let mySum: (a: number, b: number) => number = function(a, b) {
  return a + b;
}

在typescript中 => 用來表示函數(shù)的定義,左邊是輸入類型丐枉, 右邊是輸出類型哆键。注意這點和ES6的箭頭表達式的區(qū)別

參數(shù)默認值

ES6中可以直接寫默認值,ts寫法為:

function getFullName(firstName: string, lastName: string = 'William'): string {
  return firstName + ' ' + lastName;
}

rest操作符 ...
ES6語法類似:

function push(arr: any[], ...items: any[]) {
  items.forEach(function(item) {
    arr.push(item);
  });
}

let a = [];
push(a, 1, 2, 3);

函數(shù)重載

function reverse(x: number | string): number | string {
  if (typeof x === 'number') {
    return Number(x.toString().split('').reverse().join(''));
  } else if (typeof x === 'string') {
    return x.split('').reverse().join('');
  }
}

這樣寫有一個缺點矛洞,就是表達不夠精確洼哎,輸入為數(shù)字的時候,輸出也應(yīng)該為數(shù)字沼本,輸入為字符串的時候噩峦,輸出也應(yīng)該為字符串。

下面是重載的寫法:

// Typescript會優(yōu)先從最前面的函數(shù)定義開始匹配
// 所以多個函數(shù)定義如果由包含關(guān)系抽兆,需要優(yōu)先把精確的定義寫在前面识补。
function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string {
  if (typeof x === 'number') {
    return Number(x.toString().split('').reverse().join(''));
  } else if (typeof x === 'string') {
    return x.split('').reverse().join('');
  }
} 

四.類型斷言 Type Assertion

類型斷言用于繞過編譯器的類型推斷,手動指定一個值的類型

語法:

<Type>variable

// 或

value as type (React的JSX語法只能使用這種)

例子: 比如將一個聯(lián)合類型的變量指定為一個更加具體的類型

當TypeScript不確定一個聯(lián)合類型的變量到底是哪個類型時辫红, 我們只能訪問聯(lián)合類型的公共方法和屬性

function getLength(something: string | number): number {
  return something.length;
} // 報錯凭涂,number類型不存在length屬性

而有時候確實需要在還不確定類型的時候就訪問其中一個類型的屬性或方法祝辣,比如:

function getLength(something: string | number): number {
  if (something.length) {
    return something.length;
  } else {
    return something.toString().length;
  }
} // 報錯 number類型不存在length屬性

這個時候我們可以使用類型斷言,將'something' 斷言為 'string'

function getLength(something: string | number): number {
  if ((<string>something).length) { // (<string>something)
    return (<string>something).length;
  } else {
    return something.toString().length;
  }
}

// 或
function getLength(something: string | number): number {
  if ((something as string).length) { // (<string>something)
    return (something as string).length;
  } else {
    return something.toString().length;
  }
}

類型斷言不是類型轉(zhuǎn)換切油,斷言為一個不存在的類型是會報錯的

function toBoolean(something: string | number): number {
  return <boolean> somethins;
} // 錯誤 Type 'string | number' cannot be converted to type 'boolean'

五.聲明文件

當使用第3方庫的時候蝙斜,我們需要引用它的聲明文件

比如想引入jQuery

$('#name')
// 或
jQuery('#name')

但是TypeScript中,并不知道 $jQuery是什么東西澎胡,直接使用會報錯

我們需要使用 declare 關(guān)鍵字來定義它:

// declare 定義的類型只會用于編譯時的檢查孕荠,編譯結(jié)果中會被刪除。
declare var jQuery: (string) => any;

jQuery('#foo') // ok

聲明文件

通常我們會把類型聲明放到一個單獨的文件中攻谁, 約定文件以 .d.ts 為后綴:

// jQuery.d.ts
declare var jQuery: (string) => any;

然后在使用到的文件的開頭稚伍,用 /// 表示引入文件

/// <reference path="./jQuery.d.ts" />

jQuery('#name');

第3方聲明文件

當然jQuery已經(jīng)有第三方幫我們定義好了,我們可以直接安裝使用戚宦, TypeScript推薦使用 @types 來管理

@types 的使用方式也很簡單:

npm install @types/jQuery --save-dev

可以使用 TypeSearch來搜索需要的聲明文件

六.內(nèi)置對象

TypeScript內(nèi)置定義很多都定義在TypeScript核心庫中

ECMAScript 內(nèi)置對象 Boolean, Error, Date, RegExp

let b: Boolean = new Boolean(1)
let r: RegExp = /[a-z]/

DOM, BOM內(nèi)置對象:Document, HTMLElement, Event, NodeList*等

let body: HTMLElement = document.body;
let allDiv: NodeList = document.querySelectorAll('div');
document.addEventListener('click', function(e: MouseEvent)) {
  // ...
}

用TypeScript寫Node.js

Node.js不是內(nèi)置對象的一部分个曙, 如果想要用Typescript寫,則需要引入第三方聲明

npm i -D @types/node

總結(jié)

TypeScript的寫法對于有后端基礎(chǔ)的應(yīng)該很熟悉受楼,這里只是做基本的概念介紹垦搬。對我而言,斷言和聲明文件部分比較陌生那槽,另外第三方聲明文件的方式也比較陌生悼沿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末等舔,一起剝皮案震驚了整個濱河市骚灸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慌植,老刑警劉巖甚牲,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蝶柿,居然都是意外死亡丈钙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門交汤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雏赦,“玉大人,你說我怎么就攤上這事芙扎⌒歉冢” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵戒洼,是天一觀的道長俏橘。 經(jīng)常有香客問我,道長圈浇,這世上最難降的妖魔是什么寥掐? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任靴寂,我火速辦了婚禮,結(jié)果婚禮上召耘,老公的妹妹穿的比我還像新娘百炬。我一直安慰自己,他們只是感情好污它,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布收壕。 她就那樣靜靜地躺著,像睡著了一般轨蛤。 火紅的嫁衣襯著肌膚如雪蜜宪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天祥山,我揣著相機與錄音圃验,去河邊找鬼。 笑死缝呕,一個胖子當著我的面吹牛澳窑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播供常,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼摊聋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了栈暇?” 一聲冷哼從身側(cè)響起麻裁,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎源祈,沒想到半個月后煎源,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡香缺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年手销,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片图张。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡锋拖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出祸轮,到底是詐尸還是另有隱情兽埃,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布倔撞,位于F島的核電站讲仰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鄙陡,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一冕房、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧趁矾,春花似錦耙册、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蔓同,卻和暖如春饶辙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背斑粱。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工弃揽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人则北。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓矿微,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尚揣。 傳聞我的和親對象是個殘疾皇子涌矢,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

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

  • { "Unterminated string literal.": "未終止的字符串文本。", "Identifi...
    一粒沙隨風飄搖閱讀 10,560評論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理快骗,服務(wù)發(fā)現(xiàn)娜庇,斷路器,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 概述 TypeScript本質(zhì)上是向JavaScript語言添加了可選的靜態(tài)類型和基于類的面向?qū)ο缶幊瘫醢停瑫r也支持...
    oWSQo閱讀 8,518評論 1 45
  • { "Unterminated string literal.": "未終止的字符串文本思灌。", "Identifi...
    栗子雨閱讀 7,886評論 0 3