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ì)有了更深一層的了解。