TypeScript基本數(shù)據(jù)類型

一、TypeScript介紹

1.TypeScript是由微軟開(kāi)發(fā)的一款開(kāi)源的編程語(yǔ)言。
2.TypeScript是JavaScript的超集,遵循最新的ES6、ES5規(guī)范。TypeScript擴(kuò)展了JavaScript的語(yǔ)法。
3.TypeScript更像后端java、C#面向?qū)ο笳Z(yǔ)言。
4.最新的Vue、React也可以集成TypeScript。
5.Nodejs框架Nestjs、midway中用的就是TypeScript語(yǔ)法。

TypeScript相比JS的優(yōu)勢(shì)

· 優(yōu)勢(shì)一:類型化思維方式,使開(kāi)發(fā)更加嚴(yán)謹(jǐn),提前發(fā)現(xiàn)錯(cuò)誤,減少改bug時(shí)間
· 優(yōu)勢(shì)二:類型系統(tǒng)提高了代碼可讀性,并使維護(hù)和重構(gòu)代碼更加容易
· 優(yōu)勢(shì)三:補(bǔ)充了接口、枚舉等開(kāi)發(fā)大型應(yīng)用時(shí)JS缺失的功能

配置 typeScript+nodejs 和 react+typeScript 開(kāi)發(fā)環(huán)境

1.安裝nodejs(中文文檔 http://nodejs.cn,node --version查看版本)
運(yùn)行TS/JS代碼的工具:Node.js
JavaScript的運(yùn)行環(huán)境:瀏覽器、Node.js
Node.js讓JavaScript擺脫了瀏覽器的束縛,可以實(shí)現(xiàn)服務(wù)端/桌面端編程等等。
2.npm(安裝好node時(shí)就安裝好了npm, npm -v查看是否安裝成功)
3.typescript (終端命令,輸入 cnpm install -g typescript 或者 yarn global add typescript,輸入 tsc -v 查看是否安裝成功)

VSCode中搭建typeScript+nodejs開(kāi)發(fā)環(huán)境

1.新建一個(gè)空文件夾
2.使用VSCode打開(kāi)文件夾
3.生成package.json 文件

npm init -y
VSCode生成自動(dòng)編譯.ts文件

4.創(chuàng)建tsconfig.json文件

tsc --init 生成配置文件

負(fù)責(zé)獎(jiǎng)ts代dccg轉(zhuǎn)為瀏覽器和nodejs識(shí)別的js代碼

5.打開(kāi)tsconfig.json文件,把其中的 “outDir" 和 ”rootDir“ 的注釋打開(kāi),然后分別把后面的內(nèi)容修改成 " ./out " 和 " ./src ",然后就要在左邊的文件欄中創(chuàng)建這兩個(gè)文件(out表示輸出文件目錄和src表示寫代碼的資源文件目錄)

image.png

6.在src下創(chuàng)建一個(gè)index.ts文件, 同時(shí)會(huì)在out文件夾下生成index.js文件


image.png

7.運(yùn)行index.ts的代碼,需要修改 package.json 文件中的 "scripts"
修改前:


image.png

修改后:
image.png

因?yàn)樾薷牧?outDir 使得生成的 Index.js 文件放在了定義的文件夾中,那么要編譯 typeScript 的代碼,實(shí)際上就是要編譯它的 js 代碼文件,所以這里也需要做相應(yīng)的修改,否則運(yùn)行報(bào)錯(cuò)

8.運(yùn)行

 npm start

搭建 react + typeScript 開(kāi)發(fā)環(huán)境

create-react-app react_typescript --typescript
創(chuàng)建成功,再輸入終端命令: cd react_typescript
運(yùn)行:yarn start

TypeScript

  1.編譯型語(yǔ)言
  2.強(qiáng)類型語(yǔ)言
  3.真正面向?qū)ο蟮恼Z(yǔ)言

變量

變量:是用來(lái)存儲(chǔ)數(shù)據(jù)的容器,并且是可以變化的,為變量指定了類型就只能給這個(gè)變量設(shè)置相同類型的值
命名規(guī)則:變量只能出現(xiàn):數(shù)字、字母、下劃線、$,并且不能以數(shù)字開(kāi)頭。變量名稱區(qū)分大小區(qū)

基本使用

let age: number = 18
let name: String = 'name'

var的作用域是函數(shù)作用域,在內(nèi)層循環(huán)中和外層循環(huán)中使用的是同一個(gè)變量,在內(nèi)層的修改會(huì)改變外層。
let的作用域是塊級(jí)作用域,在內(nèi)層循環(huán)中的變量和外層循環(huán)中的變量不是同一個(gè)變量,在內(nèi)層的修改不會(huì)改變外層。
var:可以聲明同名變量,只會(huì)得到一個(gè)變量,let一個(gè)變量只能聲明一次

var age = 17; var age = 18; // 不會(huì)報(bào)錯(cuò)
let age = 0;  let age = 1; // 報(bào)錯(cuò)

const:定義的是常量,聲明的的變量不能被重復(fù)賦值,const聲明變量是必須立刻賦值;const聲明的對(duì)象,對(duì)象本身是不能被賦值覆蓋,但是對(duì)象的可修改屬性是允許被修改值的

const num: Number = 10;
const info = {
    name: 'name',
    age: num,
}
info.name = 'na'
info.age = 20
console.log(info);
// { name: 'na', age: 20 }

數(shù)據(jù)類型

TypeScript中的數(shù)據(jù)類型分為兩大類:原始類型(基本數(shù)據(jù)類型)、對(duì)象類型(復(fù)雜數(shù)據(jù)類型)
常用基本數(shù)據(jù)類型:number、string、boolean、undefined、null。

基本數(shù)據(jù)類型

數(shù)字類型
數(shù)字類型:包含整數(shù)和浮點(diǎn)型, 用number表示.

let age: number = 18 // 整數(shù)
let score: number = 18.8  // 浮點(diǎn)型

字符串類型
字符串:使用string表示文本數(shù)據(jù)類型??梢允褂?" ")或者(' ')表示字符串

let age: number = 18
let name: sting = '姓名'
console.log( name + `${age}`)
// 姓名18
console.log(name+age) // 加號(hào)兩邊只要有一邊是字符串,就執(zhí)行字符串拼接
// // 姓名18

布爾型
最基本的數(shù)據(jù)類型就是簡(jiǎn)單的true/false值,不能用0和1代表
關(guān)鍵字: boolean

let is: boolean = true

數(shù)組
數(shù)組:是用于存放多個(gè)數(shù)據(jù)的集合。需要聲明時(shí)指定數(shù)組中元素的類型,多個(gè)元素之間使用( , )分隔, 數(shù)組中的每一項(xiàng)內(nèi)容稱為元素
創(chuàng)建數(shù)組

// [](中括號(hào))表示數(shù)組。如果數(shù)組中沒(méi)有內(nèi)容,就是一個(gè)空數(shù)組
1. [](中括號(hào))表示數(shù)組
let 數(shù)組名: 元素類型[] = [ 元素1, 元素2, 元素3, ... ]
let list: string[] = []
2. 使用數(shù)組泛型表示,Array<元素類型>=[ 元素1, 元素2, 元素3, ... ]:
let list: Array<number> = [1, 2, 3]
3. new Array()
let list: number[] = new Array(1, 2, 3)  // 創(chuàng)建一個(gè)數(shù)組
console.log(list)   // [ 1, 2, 3 ]
4.用any類型創(chuàng)建數(shù)組
var arr: any[] = ['12345', 2345, true]

// 數(shù)組長(zhǎng)度
console.log(list.length)   // 3
// 修改元素,下標(biāo)存在表示修改
list[1] = 5
console.log(list)   // [ 1, 5, 3 ]
// 添加元素,下標(biāo)不存在表示添加
list[3] = 5
遍歷數(shù)組
for (let i = 0; i < list.length; i++) {
    console.log(list[i])
}
// 1
// 5
// 3
// 5

· push()方法將一個(gè)或多個(gè)元素添加到數(shù)組的未尾,并返回該數(shù)組的長(zhǎng)度

let num: number[] = [1, 3, 5]
num.push(7, 9)
console.log(num)
// [ 1, 3, 5, 7, 9 ]
let len = num.push()
console.log(len)
// 5

· forEach
forEach方法的參數(shù)是一個(gè)函數(shù),這種函數(shù)也稱為回調(diào)函數(shù),是作為forEeach方法的實(shí)參傳入,不需要指定類型注解
forEach方法的執(zhí)行過(guò)程: 遍歷整個(gè)數(shù)組,為數(shù)組的每一項(xiàng)元素,調(diào)用一次回調(diào)函數(shù),無(wú)法中間停止

let num: number[] = [1, 3, 5, 7]
num.forEach(function(item, index){
    console.log(item, index)
})
// 1   0
// 3   1
// 5   2
// 7   3

some方法:遍歷數(shù)組,查找是否有一個(gè)滿足條件的元素(如果有,就可以停止循環(huán))
循環(huán)特點(diǎn):根據(jù)回調(diào)函數(shù)的返回值,決定是否停止循環(huán),如果返回true,就停止;返回false就繼續(xù)循環(huán)

let num: number[] = [1, 12, 9, 8, 6]
num.some(function(num){
    console.log(num)
    if (num > 10) {
        return true
    }
})
//  1
//  12

元組(Tuple)

元組屬于數(shù)組的一種,就是固定長(zhǎng)度的數(shù)組,合并了不同類型的對(duì)象,規(guī)定了元素?cái)?shù)量和每個(gè)元素類型的數(shù)組,聲明時(shí)要指完元素個(gè)數(shù)為每個(gè)元素規(guī)定類型,元素的類型和值必須一一對(duì)應(yīng)。
語(yǔ)法:[數(shù)據(jù)類型, 數(shù)據(jù)類型, 數(shù)據(jù)類型, ... ]

let tuple: [string, number, boolean] = ['tuple', 20, false];
console.log( tuple);
// [ 'tuple', 20, false ]
console.log( tuple[1]);
// 20
修改元組
tuple[1] = 10
console.log(tuple)
// [ 'tuple', 10 ]

在聲明一個(gè)元組時(shí),可以在元素類型后綴一個(gè)問(wèn)號(hào) ? 來(lái)說(shuō)明元素是可選的,可選元素類型必須在必選元素類型后面,如果一個(gè)元素類型后面后綴了一個(gè)問(wèn)號(hào) ?,那么這個(gè)元素之后的所有元素類型都要后綴一個(gè)問(wèn)號(hào)。

let tup1: [string, number?, number?]
tup1 = ['tup']
tup1 = ['tup', 1]
tup1 = ['tup', 1, 3]

使用 push() 方法向這個(gè)元組中添加新的元素

let tup2: [string, number, number] = ['tup2', 2, 3]
tup2.push('tup')
console.log(tup2);
// [ 'tup2', 2, 3, 'tup' ]

使用 pop() 方法刪除元組中最后一個(gè)元素

let tup3: [string, number, number] = ['tup2', 2, 3]
tup3.pop()
console.log(tup3);
// [ 'tup2', 2 ]

解構(gòu)元組

let tup3: [string, number, boolean] = ['tup3', 2, true]
let [a, b, c] = tup3
console.log(a);
console.log(b);
console.log(c);
//  tup3
//  2
//  true

枚舉

枚舉是組織有關(guān)聯(lián)數(shù)據(jù)的一種方式,枚舉使用 enum 關(guān)鍵詞來(lái)聲明一個(gè)枚舉
使用場(chǎng)景:當(dāng)變量的值只能是幾個(gè)固定值中的一個(gè),應(yīng)該使用枚舉來(lái)實(shí)現(xiàn)
數(shù)字枚舉,聲明了一個(gè)枚舉成員均不帶初始化值的枚舉,枚舉的成員值從 0 開(kāi)始,依次遞增;聲明帶初始化值的枚舉,枚舉的成員值是在上一個(gè)成員的基礎(chǔ)上 +1;
· 枚舉的特點(diǎn)
數(shù)字枚舉經(jīng)過(guò)編譯之后會(huì)生成 lookup table (反向映射表),即除了生成鍵值對(duì)的集合,還會(huì)生成值鍵對(duì)的集合。
字符串枚舉沒(méi)有自增行為,必須為每一個(gè)成員賦值
枚舉成員是只讀的,只可以訪問(wèn),不能賦值
創(chuàng)建枚舉的語(yǔ)法:

enum 枚舉名稱 { 成員1, 成員2, 成員3, ... }
enum enumTS {
    ts1,
    ts2 = 10,
    ts3,
    ts4 = 'ts4',
    ts5 = 'ts5',
}
console.log(enumTS);
//   {
//     '0': 'ts1',
//    '10': 'ts2',
//     '11': 'ts3',
//     ts1: 0,
//     ts2: 10,
//     ts3: 11,
//     ts4: 'ts4',
//     ts5: 'ts5'
//   }

console.log(enumTS.ts2);
// 10

Any

Any: 任意類型可以是 Number String Boolean Object ... 等等 JS 中存在的類型,一個(gè)變量設(shè)置為any類型后相當(dāng)于對(duì)該變量關(guān)閉了TS的類型檢測(cè)
聲明變量如果不指定類型,TS會(huì)根據(jù)最后一次給變量賦值判斷變量的類型,變量不賦值會(huì)自動(dòng)判斷變量的類型為any,any類型只能賦值給unknown類型

let any: any = 2
any = 'any'
console.log(any);
// any
let anyList: any[] = [1, '2', true, false]
console.log(anyList);
// [ 1, '2', true, false ]

unknown

unknown表示未知類型的值,實(shí)際上是一個(gè)類型安全的any
unknown類型的變量,不能直接賦值給其他變量,只能賦值給any類型

let u: unknown
u = 10
u = true
u = 'any'
let a
a = u

Void

void 表示空,是 undefined 的子類型,表示沒(méi)有類型,一般用于表示沒(méi)有返回值的函數(shù)。

// 表示方法沒(méi)有返回任何類型
function say(): void {
    console.log('沒(méi)有返回值')
}
say()
//  沒(méi)有返回值

undefined、null 是never數(shù)據(jù)類型的子類型

· 共同點(diǎn):只有一個(gè)值,值為類型本身(為其它值報(bào)錯(cuò))。
· undefined:表示聲明但未賦值的變量值(找不到值)
· null:表示聲明了變量并已賦值,值為null(能找到,值就是null)

var num: number
console.log(num)   //   會(huì)報(bào)錯(cuò)(在賦值前使用了變量“num”)
var num: undefined
console.log(num)  //   不會(huì)報(bào)錯(cuò)
定義沒(méi)有賦值就是undefined
var num: number | undefined
console.log(num)     //   不會(huì)報(bào)錯(cuò)

let u: undefined = undefined
let n: null = null
console.log(u, n)
// undefined null
let u: undefined
console.log(u)
// undefined 

never

never代表不存在的值的類型,常用作拋出異?;驘o(wú)限循環(huán)的函數(shù)返回類型
never類型是ts中的底部類型,所有類型都是never類型的父類,never類型的值可以賦給任意類型的變量

function nev(): never{
    while(true) {
        console.log('死循環(huán)')
    }
}

function nev(): never{
    throw new Error('錯(cuò)誤')
}

Object

Object:表示任意的js對(duì)象

let a: object
a = {};
a = function() {

}

// {} 用來(lái)指定對(duì)象中可以包含的屬性
// 語(yǔ)法:{ 屬性名: 屬性值, 屬性名: 屬性值, 屬性名: 屬性值, ... }
// 在屬性的后邊加上?,表示屬性是可選的

let b: { name: string, age?: number}
b = { name: 'name'}
let c: { name: string, [info: string]: any }
c = { name: '1345', age: 10, sex: 12 }

類型別名

簡(jiǎn)化類型的使用

type type = 1 | 2 | 3 | 4 | 5
let k: type
let l: type
k = 1

聯(lián)合類型

表示取值可以為多種類型中的一種
let 變量名: 變量類型1 | 變量類型2 | 變量類型3 = 值;

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

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

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