初學(xué)-TypeScript-筆記01

?vue 轉(zhuǎn)向 react?,正好vue3.0 也用到TypeScript? ?? 所以需要抓緊時間學(xué)習(xí)?TypeScript 。

教學(xué)視頻 是?千鋒前端TypeScript教程陸榮濤老師主講(陸神頂配版TS入門教程)

(可能之前都有一些基礎(chǔ) 但是比較凌亂? 現(xiàn)在想系統(tǒng)性的學(xué)習(xí)一下,而且視頻 我都是看完一遍 第二遍的時候才開始記筆記? 如果有小伙伴 想學(xué)習(xí)的話 根據(jù)自己實際情況 學(xué)習(xí)就行)

學(xué)習(xí)視頻? --->??千鋒前端TypeScript教程陸榮濤老師主講

?TypeScript? 簡稱 ts

?Javascript 簡稱 js

什么是TypeScript?

ts 是 js 的一個超集,可以在ts 中使用 js 之外的擴展 語法,同時借助ts 對面向?qū)ο?和靜態(tài)類型的 良好支持,可以編寫更大型更健康的項目。

我個人理解ts 把它理解成 預(yù)編譯 也行 或者把他理解成 對你所使用的數(shù)據(jù)增加類型判斷等 從而可以在運行代碼之前就可以檢驗出代碼是否正確,從而達(dá)到了更早發(fā)現(xiàn)問題的目的。

關(guān)于 ts 的優(yōu)缺點

優(yōu)點:

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

更早發(fā)現(xiàn) BUG

代碼可預(yù)測

豐富的 IDE 支持

方便重構(gòu)

提供面向?qū)ο蟮膶懛?/p>

缺點:

不是真正的靜態(tài)類型

有一定的學(xué)習(xí)成本

需要寫更多的代碼

需要編譯

TS 常用數(shù)據(jù)類型(基礎(chǔ)篇 且 必用)

通常聲明一個變量 以 :類型? 為準(zhǔn)? 如 數(shù)字類型? ?let num:number = 6;(在以后的變量使用中 如果num的數(shù)據(jù)類型發(fā)生變化(除了null undefined 外) 則代碼編譯的時候就會警告,這就是ts 不同于js 的地方之一)

TS中的常用的數(shù)據(jù)類型有 (內(nèi)置類型)Number, String, Boolean, Null, Undefined, Void, enum,Array,Any,Object,元組, 接口等

數(shù)字類型

例如 let decimal: number = 6;

字符串

let color: string = "blue";

布爾類型

let isDone: boolean = true;

let bool1: Boolean = new Boolean();

Null和Undefined

null和undefined是所有類型的子類型,可以賦值給 任意類型的變量

undefined表示未定義的值,一個變量最原始的狀態(tài),例如聲明了變量沒有賦值

null是空值的意思,表示一個對象被人為的重置為空對象,相當(dāng)于棧中的變量沒有指向堆中的內(nèi)存對象。

let num: number = undefined;

void類型(表示沒有任何返回值的函數(shù);表示沒有任何類型

function warnUser(): void {

console.log("This is my warning message");

}

enum枚舉類型

enum Color {Red, Green, Blue}

let c: Color = Color.Greent

enum Color {Red = 1, Green, Blue}

let c: Color =color.green

數(shù)組

數(shù)組的項中不允許出現(xiàn)其他的類型; 有時候可以通過any類型來允許出現(xiàn)任意類型

類型+方括號的表示法 例如 number[], 這種類型的數(shù)組里面是不允許有除了number之外的類型

數(shù)組泛型 Array+ <類型> 例如 Array<number>

接口表示數(shù)組, 利用索引簽名

let list: number[] = [1, 2, 3];

let list: Array<number> = [1, 2, 3];

interface selfArray {

[index: number]: numer

}

let list3: selfArray = [1,2,3]

元組(數(shù)組是合并了相同類型的對象, 而元組Tuple合并了不同類型的對象

let list:[number, string] = [1, 'a']

Any類型

let notSure: any = 4;

notSure = "maybe a string instead";

notSure = false;

Object 類型

Object類型的變量只是允許你給它賦任意值 - 但是卻不能夠在它上面調(diào)用任意的方法,即便它真的有這些方法

let prettySure: Object = 4;

prettySure.toFixed(); 這行會直接報錯



安裝編輯器? 編譯環(huán)境


我個人還是習(xí)慣用webstrom 編輯器

新建 xxx.ts 文件

在該文件中輸入console.log('這是一個簡單的測試!');

然后在該文件下打開termial? ?輸入命令 tsc xxx.ts? 后 會生成一個與之相對應(yīng)的js 文件 ,然后再執(zhí)行 node xxx.js 控制臺輸出內(nèi)容。這樣一個簡單的ts 文件轉(zhuǎn)化 以及輸出 就完成了。

這里事先要說一下 將來可能會看到 xxx.ts 的文件 也會看到 xxx.tsx 文件 ,這個問題 問過大佬 大佬說?ts是js文件(通過編譯轉(zhuǎn)化成js文件) tsx是寫代碼模版的。日后會看到很多 先溫習(xí)一下基礎(chǔ)知識。

優(yōu)化編譯

解決 ts 和 js 的代碼沖突問題

當(dāng) ts 和 js 中出現(xiàn)相同方法名稱或者變量名稱的時候 會出現(xiàn)警告。

如圖


看視頻教程中用的vscode 出現(xiàn)了 但是我用的webstrom中就沒有出現(xiàn) 應(yīng)該是我本地的代碼自動編譯了,另外截圖中的參數(shù)并沒有增加類型


tsc --init? ?執(zhí)行命令后 會在文件下生成?tsconfig.json 文件里面有各種配置項 (執(zhí)行后會發(fā)現(xiàn) 方法中傳入的參數(shù)會報警告,原因是沒有定義 參數(shù)的類型)

tsc --watch? 執(zhí)行命令后 可以實時檢查代碼編譯情況,包括報錯情況。

tsc -noEmitOnError xxx.ts 文件 執(zhí)行該命令的時候 當(dāng)ts文件中的方法出現(xiàn)錯誤的時候 文件不可以編譯成js 文件。(日后項目優(yōu)化的時候 會用到)

在ts 文件中有類型的增加 如?

function greet(person:string,date:Date){

console.log(`Hello ${person}, Today is ${date.toDateString()}`);

}

中的?person:string

在編譯成js 代碼后 沒有出現(xiàn) 后面的 :string

以下是代碼部分 我直接貼出來 有空的小伙伴 勤加練習(xí)。

//字符串

let str:string ='hello world!';

//數(shù)值

let num:number =100;

//布爾

let bool:Boolean =true;

//數(shù)組? (有兩種寫法) :type[]? :Array<type>(泛型寫法)

let arr01:number[] = [1,2,3];//數(shù)組中必須是 number 類型的值

let arr02:Array = [1,2,3];

//特殊類型 any? (可以將任意類型的值 賦值給 對應(yīng)的變量)? 如下

let obj:any = {

x:0

};

obj ='any 也可以賦值成 字符串。'

//函數(shù)? :void 意思是 默認(rèn)啥也不返回? name: string? 類型注釋? :void 返回值類型注釋

function greet(name:string):void{

console.log(name)

}

greet('字符串參數(shù)。')

//也可以 寫入 number 返回值類型

function returnNum(x:number):number{

return x>1?x:1

}

returnNum(50);

//匿名函數(shù)? 會自動指定編譯類型 names 中有不同類型的值 forEach輸出的時候

// 就可以正常輸出 不報任何錯誤

//值得注意的是? 當(dāng)我們打印 x.toUpperCase()的 時候就會報錯toString() 不報錯

let names = ['1','2',3];

names.forEach(x =>{

console.log(x.toString());

})

//對象類型

function printCoord(pt:{x:number,y:number}){

console.log(pt.x)

console.log(pt.y)

}

printCoord({x:1,y:1});

// 對象類型中 傳入的參數(shù) 是可選 的? 如下 last? 就是 用戶 可傳 可不傳的 值? 不可以額外傳入 沒有接收的值

function printName(obj:{first:string,last?:string}){

console.log(obj.first)

console.log(obj.last ?obj.last:'last 沒有值');

//等同于上面的三元表達(dá)式

? ? console.log(obj.last?.toString())

}

printName({first:'對象類型中傳入last值',last:'傳入last值。'});

printName({first:'對象類型中不傳入last值'});

//聯(lián)合類型? 兩個或者多個其他類型組成的類型

// 既可以是 字符串類型 也可以是 數(shù)值類型

function printId(id:string |number ){

console.log(id);

// 類型縮小 也叫類型判斷? 其實就是 事先對傳過來的值 增加一個判斷 然后根據(jù)類型的不同做不同的事兒

? ? if(typeof id ==="string"){

console.log('傳過來的是個字符串類型。')

}else{

console.log('傳過來的是個數(shù)值類型。')

}

}

printId(100)

printId('100')

// 既可以傳入 字符串? 也可以傳入 字符串類型的數(shù)組

// 這里 主要是想練習(xí)一下 Array.isArray(xxx) 的方法,以前都是通過 長度判斷是否為字符串的

function welcomePeople(x:string[] |string){

if(Array.isArray(x)){

console.log('傳過來的是個字符串類型的數(shù)組。')

}else {

console.log('傳過來的是個字符串。')

}

}

welcomePeople(['1','2','3']);

welcomePeople('傳入字符串。');

// 類型別名? 通過 type? 直接定義? 對象 數(shù)值 字符串 三種類型

type obj = {

x:number,

y:number

};

type Id =number;

type name =string;

type arr = Boolean;

function isObjType(point:obj){

console.log(point.x)

console.log(point.y)

}

isObjType({x:0,y:1});

function isString(x:Id){

console.log(x)

}

// 自定義返回值 方式? 之前的:void

type useArr =string;

function isMethods(str:string):useArr{

return str;

}

isMethods('返回一個字符串。')

最后編輯于
?著作權(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)容

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