TypeScript -- what why and how

1. What is

  • Ts是Js的超集,所有的Js代碼都是Ts代碼,但反過來不是,Ts增加了一些額外的語法用來聲明類型

初學(xué)Ts的時候,我一直把它看作是Js+Type,但它其實是一門獨立的語言,只是語法上是Js + Type再加上一些它獨有的東西
TypeScript被編譯成JavaScript才能在瀏覽器上跑,你可以在playground上直接看你的ts編譯后的Js代碼,可以猜猜下面這段代碼編譯后的Js是什么

interface Square {
  width: number;
}

嗯,編譯后是空的,ts編譯器的其中一項工作就是去掉所有的interface、type以及類型注解。所以,運行時是無法獲取類型的,只能獲取值。
所以,你寫的類型注解是通通不會影響編譯后的Js的,而且,即便有類型錯誤,可能代碼還是可以正常運行,它在某種程度上(取決于你的配置)可以看做是一種警告,它拋出問題,但不影響構(gòu)建。

下面這段代碼就誤解了Ts,as number并不能真正地把val轉(zhuǎn)化成number,只有Number(val)才可以

function asNumber(val: number | string): number {
  return val as number
}

再看下面這段代碼,理論上永遠不會輸出I'm afraid I can't do that.,但是別忘了,Ts的類型注解在運行時是不存在的,入?yún)⒂锌赡苁瞧渌愋?,比如這個入?yún)⒅凳莵碜杂谀硞€請求。

function setLightSwitch(value: boolean) {
  switch (value) {
    case true:
      turnLightOn();
      break;
    case false:
      turnLightOff();
      break;
    default:
      console.log(`I'm afraid I can't do that.`);
  }
}

總結(jié)一下:

  • 類型操作是不會改變運行時的值的
  • 每個值都有可能是你聲明的類型之外的類型,做好相應(yīng)處理

2. why it

上面講到Ts的類型注解,操作符在編譯后都是不存在的,所以不會增大編譯后代碼的體積。
ts目標(biāo):

  • 在運行代碼之前拋出運行時異常
  • 捕捉一些不會拋出異常,但是并非你想要的情況(比如一些拼寫錯誤)

Ts的類型系統(tǒng)模擬了Js的運行時行為,但很多情況下,一些使用Js不會報錯的行為,Ts會認為是錯誤而不是開發(fā)者的真實意圖。比如

const a = null + 7; // 報錯

const b = [] + 12; // 報錯

const states = [
  {name: 'Alabama', capital: 'Montgomery'},
  {name: 'Alaska',  capital: 'Juneau'},
  {name: 'Arizona', capital: 'Phoenix'},
];

for (const state of states) {
  console.log(state.capitol); // 報錯
}

Ts能揣測你的意圖,很多時候它都是對的,還提供了補全功能,如果用了補全,state.capitol這種情況就絕不會出現(xiàn)啦。

3. how to

如何學(xué)習(xí)Ts呢,首先肯定是開發(fā)手冊,畢竟是一門新語言,語法還是需要掌握的。
如今很多前段項目都是Ts開發(fā)的,也有很多Js項目在向Ts遷移,使用的機會很多,像我最開始使用就是在一個Js轉(zhuǎn)Ts的項目中。
作為初學(xué)初用,又是Js轉(zhuǎn)Ts的項目中,遇到一些很難解決的類型報錯時,不要對使用any抱有很大的抵觸或者愧疚心理,畢竟all any === Js,寫了這么多年Js了,再寫點也無妨。
coding總是要兼顧效率和質(zhì)量的。
但是一定要把那些沒有解決的問題記錄下來,不然問題就永遠是問題,而不是知識。
等積累足夠多的問題之后,建議找本書看看,比如我找到了《Effective TypeScript》這本書,后續(xù)會出Ts系列博客也可以看做是這本書的讀后感,還有一些對它的翻譯。
這不是一本語法書,它更多的是使用了Ts后的一些經(jīng)驗和總結(jié),很多地方都讓我有恍然大悟的感覺,讓我對Ts的本質(zhì)有了更深一層的了解。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. typescript介紹 1.1. 什么是typescript? TypeScript簡稱TSTS和JS之間...
    BingJS閱讀 3,058評論 0 10
  • TS是什么 為什么要用TS TS能干什么 社區(qū)發(fā)展 周邊生態(tài) 深入理解TS 接受TS 權(quán)衡 TS是什么 為什么要用...
    碎月雨中奏besos閱讀 467評論 0 0
  • 本文接 TypeScript 基礎(chǔ)語法入門[http://www.itdecent.cn/p/8fe11ebb7...
    橙色流年閱讀 1,094評論 0 2
  • 總評:感覺是官方文檔的衍生閱讀,重點不在于介紹TypeScript語法本身,語法就是第一章的部分,不到30頁的說明...
    沉寂之舟閱讀 1,532評論 0 0
  • 這一章主要總結(jié)TypeScript的用法和項目常用配置 編譯上下文 用來給文件分組,告訴 TypeScript 哪...
    Terryzh閱讀 2,134評論 0 0

友情鏈接更多精彩內(nèi)容