TypeScript簡(jiǎn)介 TypeScript是什么

快速入門

筆者沒有開發(fā)web的經(jīng)驗(yàn),對(duì)javascript也沒有學(xué)過,新項(xiàng)目,直接用TypeScript,前半部分提供給和筆者一樣,需要快速進(jìn)入項(xiàng)目的小伙伴。分割線之后,是筆者copy的覺得還不錯(cuò)的文章,供想深入了解的人參考。

一.TypeScript的優(yōu)點(diǎn)

TypeScript 相比于 JavaScript 具有以下優(yōu)勢(shì):

  • 更好的可維護(hù)性和可讀性
  • 引入了靜態(tài)類型聲明,不需要太多的注釋和文檔,大部分的函數(shù)看類型定義就知道如何使用了
  • 在編譯階段就能發(fā)現(xiàn)大部分因?yàn)樽兞款愋蛯?dǎo)致的錯(cuò)誤
  • ...

二.安裝

npm install typescript -g

三.使用

直接像寫javascript一樣去寫,初始化的時(shí)候,需要指定類型名,沒有指定時(shí),編譯會(huì)出錯(cuò),有提示。所以,不了解的話,就直接寫javascript的代碼,報(bào)錯(cuò)了再改。多遇到幾次錯(cuò)誤,大抵也就明白了些。

//初始化變量的時(shí)候,需要指定類型
const ary = [] 
const data = {}

//para必須指定類型,否則會(huì)報(bào)錯(cuò)。
function testFunc(para: any) {
  .....
}

另外,使用TypeScript開發(fā)時(shí),文件后綴要用tsx。傳統(tǒng)js和jsx與ts和tsx的區(qū)別

四. JavaScript項(xiàng)目遷移

如何你是現(xiàn)有項(xiàng)目,想該用TypeScript,那么你需要整體遷移

===============================這里是分割線==========================
原文鏈接

前言

最近開始用 TypeScript 來寫項(xiàng)目,寫起來還是挺順暢的。其實(shí)學(xué)習(xí) TypeScript,看它的官方文檔就夠了,剩下就是 coding 了。這里主要是我在 TypeScript 學(xué)習(xí)過程中記錄的一些東西~

什么是 TypeScript

TypeScript 也被稱作 AnyScript,因?yàn)槟阍?coding 的時(shí)候會(huì)給每個(gè)變量設(shè)一個(gè) any 的類型。

咳咳,開玩笑開玩笑,可別真的讓每個(gè)變量都是 any,會(huì)被瘋狂吐槽的。

TypeScript 是微軟開發(fā)一款開源的編程語言,它是 JavaScript 的一個(gè)超集,本質(zhì)上是為 JavaScript 增加了靜態(tài)類型聲明。任何的 JavaScript 代碼都可以在其中使用,不會(huì)有任何問題。TypeScript 最終也會(huì)被編譯成 JavaScript,使其在瀏覽器、Node 中等環(huán)境中使用。

Typescript 和 JavaScript 在類型上的區(qū)別

JavaScript 被稱作是一種動(dòng)態(tài)腳本語言,其中有一個(gè)被瘋狂詬病的特性:缺乏靜態(tài)強(qiáng)類型。我們看一下下面的代碼:

function init() {
    var a = 'axuebin';
    console.log('a: ', a); // a: axuebin
    a = 1;
    console.log('a: ', a); // a: 1
}
復(fù)制代碼

當(dāng)我們執(zhí)行 init 函數(shù)的時(shí)候,會(huì)先聲明一個(gè) a 變量,然后給 a 變量賦了一個(gè) axuebin,這時(shí)候我們知道 a 是一個(gè)字符串。然后這時(shí)候我們希望 a 變成 1,就直接 a = 1 了。當(dāng)然,這是可以的,此時(shí) a 變量的類型已經(jīng)發(fā)生改變:字符串 => 數(shù)字。這在很多人看來是難以接受的事情,明明初始化 a 的時(shí)候是一個(gè)字符串類型,之后 a 的類型居然變成數(shù)字類型了,這太糟糕了。

如果在 Java 中,會(huì)是這樣:

class HelloWorld {
    public static void main(String[] args) {
        String a = "axuebin";
        System.out.printf("a: %s", a);
        a = 1;
        System.out.printf("a: %d", a);
    }
}

// HelloWorld.java:4: error: incompatible types: int cannot be converted to String
復(fù)制代碼

Java 中根本就沒辦法讓 a = 1,會(huì)直接導(dǎo)致報(bào)錯(cuò),在編譯階段就斷絕你的一切念想。年輕人,別想太多,好好寫代碼。

這時(shí)候就會(huì)想,如果 JavaScript 也有類型該有多好啊,是吧。

看看 TypeScript 中是怎么樣的:

function init() {
    var a: string = 'axuebin';
    console.log('a: ', a); 
    a = 1;
    console.log('a: ', a);
}

// Type '1' is not assignable to type 'string'.
復(fù)制代碼

我們把變量 a 設(shè)為 string 類型,后面給 a 賦值 1 的時(shí)候就報(bào)錯(cuò)了,同樣是在編譯階段就過不了。

為什么選擇 TypeScript

我們來想想在日常的業(yè)務(wù)開發(fā)中是否有遇到以下的情況:

  • 協(xié)同開發(fā)時(shí),你需要調(diào)用一個(gè)其他人寫的函數(shù),但是那個(gè)函數(shù)里變量命名和管理特別混亂,并且沒有寫任何的注釋,為了搞清楚函數(shù)的參數(shù)類型以及用法,你只能硬著頭皮讀函數(shù)的具體代碼。
  • 你突然看到項(xiàng)目里自己半年前甚至一年前的一個(gè)函數(shù),這寫的什么鬼啊,簡(jiǎn)直沒法看,強(qiáng)迫癥的你想著重構(gòu)。然后你就大刀闊斧的改造了一把,甚至對(duì)入?yún)⒍歼M(jìn)行了改造,嗯,終于滿意了。突然發(fā)現(xiàn)不對(duì)啊,還得搜了一下哪里調(diào)用了這個(gè)函數(shù),得保證調(diào)用成功啊。
  • ...

是不是超級(jí)超級(jí)超級(jí)不爽。歸根結(jié)底這還是因?yàn)?JavaScript 是一門動(dòng)態(tài)弱類型腳本語言。

你想想,如果每個(gè)變量都被約定了類型,并且構(gòu)建了變量聲明和變量調(diào)用之間的聯(lián)系,只要有一處地方發(fā)生了改變,其它地方都會(huì)被通知到,這該有多美好。

JavaScript 淡化了類型的概念,但是作為一名開發(fā)者,我們必須要牢記類型概念,養(yǎng)成良好的編程習(xí)慣。

TypeScript 的優(yōu)點(diǎn)

TypeScript 相比于 JavaScript 具有以下優(yōu)勢(shì):

  • 更好的可維護(hù)性和可讀性
  • 引入了靜態(tài)類型聲明,不需要太多的注釋和文檔,大部分的函數(shù)看類型定義就知道如何使用了
  • 在編譯階段就能發(fā)現(xiàn)大部分因?yàn)樽兞款愋蛯?dǎo)致的錯(cuò)誤
  • ...

TypeScript 是不是能難

有的童鞋可能會(huì)覺得,JavaScript 都還沒學(xué)清楚,又得學(xué)一門新的編程語言,還沒接觸 TypeScript 就已經(jīng)無形中有了抵觸心理。對(duì)于這些童鞋,需要知道的是 TypeScriptJavaScript 的超集,與現(xiàn)存的 JavaScript 代碼有非常高的兼容性。

如果一個(gè)集合S2中的每一個(gè)元素都在集合S1中,且集合S1中可能包含S2中沒有的元素,則集合S1就是S2的一個(gè)超集。

也就是說,TypeScript 包含了 JavaScriptall,即使是僅僅將 .js 改成 .ts,不修改任何的代碼都可以運(yùn)行。

所以說,完全可以先上手再學(xué)習(xí),漸進(jìn)式地搞定 TypeScript,不用擔(dān)心門檻高的問題。

如果還有顧慮,可以在 www.typescriptlang.org/play/ 上先體驗(yàn)一下 TypeScript 帶來的快感。

TypeScript 的困難

當(dāng)然,上手 TypeScript 也會(huì)有一些困難,會(huì)讓剛開始學(xué)習(xí) TypeScript 的童鞋感覺太復(fù)雜了,不熟悉的情況下很可能會(huì)增加開發(fā)成本:

  • 類型定義:對(duì)于每一個(gè)變量都需要定義它的類型,特別是對(duì)于一個(gè)對(duì)象而言,可能需要定義多層類型(這也是為什么會(huì)出現(xiàn) AnyScript 的原因。。。)
  • 引用三方類庫:第三方庫如果不是 TypeScript 寫的,沒有提供聲明文件,就需要去為第三方庫編寫聲明文件
  • 新概念:TypeScript 中引入的類型(Types)、類(Classes)、泛型(Generics)、接口(Interfaces)以及枚舉(Enums),這些概念如果之前沒有接觸過強(qiáng)類型語言的話,就需要增加一些學(xué)習(xí)成本

不過,不要被嚇退了!

重要的事情要說三遍。

不要被嚇退了!!

不要被嚇退了!!!

這些只是短期的,當(dāng)克服這些困難后,就會(huì)如魚得水,一切看上去都是那么的自然。

安裝 TypeScript

首先你需要有 Nodenpm,這個(gè)不用多說了。

在控制臺(tái)運(yùn)行一下命令:

npm install typescript -g
復(fù)制代碼

這條命令會(huì)在全局安裝 typescript,并且安裝 tsc 命令,運(yùn)行以下命令可以查看當(dāng)前版本(確認(rèn)安裝成功):

tsc -v
// Version 3.2.2
復(fù)制代碼

然后我們就新建一個(gè)名為 index.ts 的文件,然后敲入簡(jiǎn)單點(diǎn)的代碼:

// index.ts
const msg: string = 'Hello TypeScript';
復(fù)制代碼

代碼編寫好就可以執(zhí)行編譯,可以運(yùn)行 tsc 命令,讓 ts 文件變成可在瀏覽器中運(yùn)行的 js 文件:

tsc index.ts
復(fù)制代碼

如果你的代碼不合法,執(zhí)行 tsc 的時(shí)候就會(huì)報(bào)錯(cuò),根據(jù)錯(cuò)誤進(jìn)行對(duì)應(yīng)的修改即可。

Hello TypeScript

我們看一個(gè)稍微完整點(diǎn)的例子吧。

這是一個(gè) ts 文件,聲明了一個(gè) sayHello 函數(shù):

  • 函數(shù)有一個(gè)入?yún)ⅲ?code>string 類型的 name
  • 函數(shù)有一個(gè)返回值:string 類型的 Hello ${name}
// index.ts
function sayHello(name: string): string {
    return `Hello ${name}`;
}

const me: string = 'axuebin';
console.log(sayHello(me))
復(fù)制代碼

我們執(zhí)行 tsc index.ts 編譯一下,在同級(jí)文件夾下生成了一個(gè)新的文件 index.js

function sayHello(name) {
    return "Hello " + name;
}
var me = 'axuebin';
console.log(sayHello(me));
復(fù)制代碼

我們發(fā)現(xiàn)我們寫的 TypeScript 代碼在編譯后都消失了。因?yàn)?TypeScript 只會(huì)進(jìn)行靜態(tài)檢查,如果代碼有問題,在編譯階段就會(huì)報(bào)錯(cuò)。

我們修改一下 index.ts ,模擬一下出錯(cuò)的情況:

function sayHello(name: string): string {
    return `Hello ${name}`;
}

const count: number = 1000;
console.log(sayHello(count))
復(fù)制代碼

我們向 sayHello 傳遞一個(gè) number 類型的參數(shù),試試 tsc 一下:

index.ts:6:22 - error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'.
復(fù)制代碼

命令行就會(huì)報(bào)上面的錯(cuò)誤,意思是不能給一個(gè) string 類型的參數(shù)傳遞一個(gè) number 類型。

但是,這里要注意的是,即使報(bào)錯(cuò)了,tsc 還是會(huì)將編譯進(jìn)行到底,還是會(huì)生成一個(gè) index.js 文件:

function sayHello(name) {
    return "Hello " + name;
}
var count = 1000;
console.log(sayHello(count));
復(fù)制代碼

看上去也就是沒啥毛病的 js 代碼。

如果編譯失敗就不生成 js 文件,之后可以在配置中關(guān)閉這個(gè)功能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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