微信小程序 TypeScript 嘗試

自從去年開(kāi)始在項(xiàng)目里寫(xiě)了一段時(shí)間 Javascript 后憎瘸,感覺(jué)沒(méi)有類型檢查的語(yǔ)言還是不太適合我顿锰,所以一直想嘗試下 TypeScript器赞,然而由于項(xiàng)目龐大垢袱,人員協(xié)作問(wèn)題,一時(shí)半會(huì)沒(méi)辦法切成 TypeScript港柜。正好最近有小程序的需求和小程序去年 11 月開(kāi)始官方支持了 TypeScript请契,所以拿來(lái)練練手。

Why TypeScript夏醉?

大概是我這半年寫(xiě)的 Swift 比較多爽锥,而 Swift 中的靜態(tài)類型和協(xié)議是我很喜歡的特性。正好 TypeScript 為 JavaScript 帶來(lái)了靜態(tài)類型接口畔柔。

可選的靜態(tài)類型

“動(dòng)態(tài)類型一時(shí)爽氯夷,代碼重構(gòu)火葬場(chǎng)“,對(duì)于我這種極度喜歡重(xia)構(gòu)(gai)代碼的人來(lái)說(shuō)释树,JavaScript 毫無(wú)類型提示肠槽,類型全靠命名猜測(cè)是極度不友好的。而 TypeScript 加上了靈活的類型系統(tǒng)奢啥,不僅可以編碼期檢查秸仙,還能增強(qiáng)代碼的可讀性,并提供了 any 類型進(jìn)行緩沖桩盲。

接口

接口和協(xié)議寂纪,只是不一樣的叫法而已,Java、C#捞蛋、TypeScript 叫 Interface孝冒,Swift、Kotlin 叫 Protocol拟杉,就是一種規(guī)則聲明庄涡。項(xiàng)目中,和后端接口數(shù)據(jù)交互搬设,頁(yè)面?zhèn)鬟f數(shù)據(jù)穴店,數(shù)據(jù)持有,方法代理的地方拿穴,有了接口就會(huì)更加方便泣洞,易重構(gòu)。TypeScript 的 Interface + JavaScript 簡(jiǎn)單的對(duì)象就讓數(shù)據(jù)構(gòu)建變得簡(jiǎn)單又不容易出錯(cuò)默色。

小程序?qū)?TypeScript 的支持

TypeScript 有一個(gè)很重要的東西球凰,就是 d.ts 文件。d.ts 文件其實(shí)相當(dāng)于 C 系語(yǔ)言里面的 .h 頭文件腿宰,聲明了對(duì)外暴露的方法和屬性呕诉。而小程序官方對(duì) TypeScript 的支持,意味著官方會(huì)維護(hù)小程序本身 API 的 d.ts 文件吃度,也就是 typing 庫(kù)义钉,這樣當(dāng) API 發(fā)生變動(dòng)時(shí),就可以即時(shí)變更规肴。

使用也很簡(jiǎn)單,更新微信開(kāi)發(fā)者工具到最新版夜畴,在創(chuàng)建新項(xiàng)目時(shí)選擇 TypeScript 模板拖刃。

屏幕快照 2019-01-30 下午8.51.40

創(chuàng)建后,我們可以看到項(xiàng)目里帶上了 typings 庫(kù)贪绘,以及 TypeScript 的配置文件 tsconifg兑牡。之后,保存時(shí)就不會(huì)自動(dòng)編譯了税灌,要點(diǎn)擊小程序工具欄的編譯按鈕才可以均函。

這里有一個(gè)坑,筆者電腦安裝的 TypeScript 版本是 3.2.2 版本菱涤。編譯時(shí)會(huì)被找不到全局類型 CallableFunction 和 NewableFunction苞也。

image-20190130195121996

解決方法也很簡(jiǎn)單,到 node_modules 路徑下的 TypeScript 包的 bin 目錄下粘秆,lib.es5.d.ts 文件里面把這兩個(gè)類型的 Interface 拷貝到如迟,小程序 typing 目錄下的 lib.wa.es6.d.ts 里面就可以了。小程序模板里這個(gè)文件應(yīng)該是拷貝 TypeScript 官方的,但沒(méi)有隨著官方升級(jí)而改變殷勘。

事件

視圖的事件此再,對(duì)應(yīng)的類型筆者在 typings 中并沒(méi)有看到有 Interface 定義,所以只能暫時(shí)用 any玲销,然后自己再用

as 轉(zhuǎn)一下 event 攜帶的數(shù)據(jù)的類型输拇。

Page&Data

每個(gè) Page 對(duì)象,在 typing 里是這么定義的贤斜。

declare const Page: Page.PageConstructor

interface PageConstructor {
    <D extends IAnyObject, T extends IAnyObject & PageInstance>(
      options: PageInstance<D, T> & T
    ): void
  }

也就是說(shuō)策吠,它支持 D 和 T 兩個(gè)范型。這兩個(gè)范型是什么呢蠢古?小程序里奴曙,Page 是這么寫(xiě)的。

Page({});

也就是說(shuō)草讶,options 參數(shù)就是一個(gè) PageInstance洽糟,范型也被傳入了。

interface PageInstance<D extends IAnyObject = any, T extends IAnyObject = any> extends PageInstanceBaseProps<D>

PageInstance 里面定義了 Page 聲明周期的方法堕战,而且繼承自 PageInstanceBaseProps坤溃,并將范型 D 傳入。

interface PageInstanceBaseProps<D extends IAnyObject = any> {
    data?: D
    //...
}

所以這個(gè) D 范型嘱丢,其實(shí)就是 data 的類型接口薪介。因?yàn)?data 不是必須實(shí)現(xiàn)的,所以這里是可選型 越驻?汁政。

那么 T 是什么呢?

T extends IAnyObject & PageInstance

T 其實(shí)就是對(duì) PageInstance 的拓展缀旁,PageInstance 是 Page 的實(shí)例接口记劈,那么 T 其實(shí)就是在 Page 里面 this 的類型接口了,也就是說(shuō)并巍,需要在 Page 里新增的方法和屬性目木,都在 T 里定義。

所以懊渡,對(duì)于一個(gè)普通頁(yè)面我們可以聲明兩個(gè)接口刽射,一個(gè)代表 data, 一個(gè)代表 page剃执,舉個(gè)例子誓禁。

interface IIntroPage {
    nextButtonTap(event: any): void;
    isLoading: boolean;
}

interface IIntroData {
    test: string;
}

Page<IIntroData, IIntroPage>({
    isLoading: false,
    nextButtonTap(event: any) {
        this.isLoading = true;
    }
});

如果這個(gè)頁(yè)面不需要 data 或者不需要擴(kuò)展 page,用 IAnyObject 代替 D 或者 T 即可忠蝗。

interface PageInstanceBaseProps<D extends IAnyObject = any> {
    data?: D
    setData?<K extends keyof D>(
      data: D | Pick<D, K> | IAnyObject,
      callback?: () => void
    ): void
}

同時(shí)现横,由于 setData 和 data 都被聲明為可選項(xiàng),使用時(shí)需要加上!戒祠,this.setData!({})this.data!骇两。

其他就沒(méi)什么了,用上 TypeScript 之后姜盈,官方的 API 都可以直接看參數(shù)和返回值的類型低千,再也不用去查文檔猜測(cè)類型了。

調(diào)用 JavaScript

為 JavaScript 編寫(xiě)一個(gè)簡(jiǎn)單的 .d.ts 文件馏颂,將需要調(diào)用的類和方法暴露出來(lái)示血。詳情見(jiàn)如何編寫(xiě)一個(gè)d.ts文件

最后

雖然筆者用了 TypeScript 不久救拉,但嚴(yán)格的檢查的確讓我在增刪改接口字段能快速全局重構(gòu)难审,而且方法調(diào)用聯(lián)想,API 查看也方便了不少亿絮。小程序?qū)?TypeScript 的支持日常使用開(kāi)發(fā)是沒(méi)有什么問(wèn)題了告喊,就是官方的文檔指引比較少。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末派昧,一起剝皮案震驚了整個(gè)濱河市黔姜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蒂萎,老刑警劉巖秆吵,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異五慈,居然都是意外死亡纳寂,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門泻拦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)烈疚,“玉大人,你說(shuō)我怎么就攤上這事聪轿。” “怎么了猾浦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵陆错,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我金赦,道長(zhǎng)音瓷,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任夹抗,我火速辦了婚禮绳慎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己杏愤,他們只是感情好靡砌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著珊楼,像睡著了一般通殃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上厕宗,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天画舌,我揣著相機(jī)與錄音,去河邊找鬼已慢。 笑死曲聂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的佑惠。 我是一名探鬼主播朋腋,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼兢仰!你這毒婦竟也來(lái)了乍丈?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤把将,失蹤者是張志新(化名)和其女友劉穎轻专,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體察蹲,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡请垛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洽议。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宗收。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖亚兄,靈堂內(nèi)的尸體忽然破棺而出混稽,到底是詐尸還是另有隱情,我是刑警寧澤审胚,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布匈勋,位于F島的核電站,受9級(jí)特大地震影響膳叨,放射性物質(zhì)發(fā)生泄漏洽洁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一菲嘴、第九天 我趴在偏房一處隱蔽的房頂上張望饿自。 院中可真熱鬧汰翠,春花似錦、人聲如沸昭雌。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)城豁。三九已至苟穆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唱星,已是汗流浹背雳旅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留间聊,地道東北人攒盈。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像哎榴,于是被迫代替她去往敵國(guó)和親型豁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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