主頁 > 企業開發 > TypeScript——02——TS基本資料型別介紹和使用

TypeScript——02——TS基本資料型別介紹和使用

2021-02-19 06:43:07 企業開發

一,TS的資料型別

ES6的資料型別:

6種基本資料型別

	Boolean
	Number
	String
	Symbol
	undefined
	null

3種參考型別

	Array
	Function
	Object
TS的資料型別:

TS在ES6基礎上,又新增了以下資料型別

	void
	any
	never
	元組
	列舉
	高級型別

除此之外,TS還有很多型別的高級使用技巧


二,型別注解

TS可以通過型別注解對變數型別進行約束
TS和JS最主要的區別:變數的資料型別不可改變

語法: 變數/函式 : type

如: let hello : string = 'Hello TypeScript'

 


三,原始型別

let bl: boolean = true
let num: number = 123
let str: string = "123"

使用型別注解對變數進行型別約束后,再進行不恰當的賦值就會報錯


四,陣列型別

在 TypeScript 中,陣列型別有多種定義方式,主要有一下三種定義方法:

1、「型別 + 方括號」表示法

let  tsArray: number[] = [1,1,2,3,4]

  陣列中的項中不允許出現其他型別

let fibonacci: number[] = [1, '1', 2, 3, 5];
//報錯

  上例中,[1, '1', 2, 3, 5] 的型別被推斷為 (number | string)[],這是聯合型別和陣列的結合,

 陣列的一些方法的引數也會根據陣列在定義時約定的型別進行限制:

let fibonacci: number[] = [0, 1, 2, 3, 5];
fibonacci.push('6');
// index.ts(2,16): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.

  上例中,push 方法只允許傳入 number 型別的引數,但是卻傳了一個 string 型別的引數,所以報錯了, 

 

2、陣列泛型 

 使用陣列泛型(Array Generic) Array<elemType> 來表示陣列:  

let arrType: Array<number> = [0, 1, 2, 3, 5];
let arrType1: Array<string> = ['0', '1', '2', '3', '5'];
let arrType2: Array<any> = [1, '1', 2, 's', true];

 

3、用介面表示陣列

interface Person{
  name: string;
  age: number;
}
interface NumberArray {
       [index:number]: Person;         
}
let arrType3: NumberArray = [{name:'張三',age: 20}]
let arrType4:Array<Person> = [{name:'張三',age: 20}]
let arrType5:Person[] = [{name:'張三',age: 20}]

 NumberArray 表示:只要 index 的型別是 number,那么值的結構型別必須是符合Person介面,

  類陣列(特別注意)

    類陣列(Array-like Object)不是陣列型別,比如 arguments

function sum() {
    let args: number[] = arguments;
}

// index.ts(2,7): error TS2322: Type 'IArguments' is not assignable to type 'number[]'.
//   Property 'push' is missing in type 'IArguments'.

  事實上常見的類陣列都有自己的介面定義,如 IArgumentsNodeListHTMLCollection 等:

function sum() {
    let args: IArguments = arguments;
}

 


五,元組型別

是一種限制陣列的元素型別和個數的陣列
let tuple: [number, string] = [0, '1']

此時,如果改變陣列的元素型別或添加元素數量,編輯器都會報錯:

let tuple: [number, string] = [0, 1]
//Type 'number' is not assignable to type 'string'.

let tuple: [number, string] = [0, '1', '2']

//報錯:
Type '[number, string, string]' is not assignable to type '[number, string]'.
Types of property 'length' are incompatible.
Type '3' is not assignable to type '2'.
元組越界問題:

雖然元組限制了陣列元素的型別和數量,過多的元素宣告會報錯
但TS允許向元組中使用陣列的push方法插入新元素(但不允許訪問)

let tuple: [number, string] = [0, '1']
tuple.push(2)
console.log("tuple.push(2)", tuple) // tuple.push(2) (3) [0, "1", 2]

但不允許訪問:

tuple.push(2)    // 可越界添加
tuple[2]    // 不可越界訪問

//報錯:
//Tuple type '[number, string]' of length '2' has no element at index '2'.

 


六,函式

  在 JavaScript 中,有兩種常見的定義函式的方式——函式宣告(Function Declaration)和函式運算式(Function Expression):

// 函式宣告(Function Declaration)
function sum(x, y) {
    return x + y;
}

// 函式運算式(Function Expression)
let mySum = function (x, y) {
    return x + y;
};

1、函式宣告

一個函式有輸入和輸出,要在 TypeScript 中對其進行約束,需要把輸入和輸出都考慮到,其中函式宣告的型別定義較簡單:

function sum(x:number,y:number):number{
       return x+y  
}

注意,輸入多余的或者少于要求的引數,是不被允許的

sum(1, 2, 3);

// index.ts(4,1): error TS2346: Supplied parameters do not match any signature of call target.
sum(1);

// index.ts(4,1): error TS2346: Supplied parameters do not match any signature of call target.

 2、函式運算式

  如果要我們現在寫一個對函式運算式(Function Expression)的定義,可能會寫成這樣

let mySun = function(x:number,y:number):number{
      return x + y  
}

 

這是可以通過編譯的,不過事實上,上面的代碼只對等號右側的匿名函式進行了型別定義,而等號左邊的 mySum,是通過賦值操作進行型別推論而推斷出來的,如果需要我們手動給 mySum 添加型別,則應該是這樣:

let mySum(x:number,y:number)=>number = function(x:number,y:number):number{
  return x+y}

注意不要混淆了 TypeScript 中的 => 和 ES6 中的 =>

在 TypeScript 的型別定義中,=> 用來表示函式的定義,左邊是輸入型別,需要用括號括起來,右邊是輸出型別,

在 ES6 中,=> 叫做箭頭函式,應用十分廣泛,

3、用介面定義函式的形狀

我們也可以使用介面的方式來定義一個函式需要符合的形狀:

interface SearchFunc{
       (source:string,subString:string):boolean
}    

let mySearch:SearchFunc;
mySearch = function(source: string,subString:string){
     return source.search(subString) !== -1  
}

函式入參

1、可選引數

前面提到,輸入多余的(或者少于要求的)引數,是不允許的,那么如何定義可選的引數呢?

與介面中的可選屬性類似,我們用 ? 表示可選的引數:

function buildName(firstName: string, lastName?: string) {
    if (lastName) {
        return firstName + ' ' + lastName;
    } else {
        return firstName;
    }
}
let tomcat = buildName('Tom', 'Cat');
let tom = buildName('Tom');

注意:可選引數必須接在必需引數后面,換句話說,可選引數后面不允許再出現必須引數了

2、引數默認值

在 ES6 中,我們允許給函式的引數添加默認值,TypeScript 會將添加了默認值的引數識別為可選引數:

function buildName(firstName:string,lastName:string='Cat'){
    return firstName + ' ' + lastName;
}
let tomcat = buildName('Tom', 'Cat');
let tom = buildName('Tom');

此時就不受「可選引數必須接在必需引數后面」的限制了:

function buildName(firstName: string = 'Tom', lastName: string) {
    return firstName + ' ' + lastName;
}
let tomcat = buildName('Tom', 'Cat');
let cat = buildName(undefined, 'Cat');

3、剩余引數 

 ES6 中,可以使用 ...rest 的方式獲取函式中的剩余引數(rest 引數):

function push(array,...items){
     items.forEach(function(item){
        array.push(item)
  })  
}

let a = [];
push(a,1,2,3)

事實上,items 是一個陣列,所以我們可以用陣列的型別來定義它:

function push(array:any[],...items:any[]){
     items.forEach(function(item){
         array.push(item);
    })  
}

let a = []
push(a,1,2,3)

注意:rest 引數只能是最后一個引數

多載:

多載允許一個函式接受不同數量或型別的引數時,作出不同的處理,

 比如,我們需要實作一個函式 reverse,輸入數字 123 的時候,輸出反轉的數字 321,輸入字串 'hello' 的時候,輸出反轉的字串 'olleh'

利用聯合型別,我們可以這么實作:

function reverse(x: number | string): number | string {
    if (typeof x === 'number') {
        return Number(x.toString().split('').reverse().join(''));
    } else if (typeof x === 'string') {
        return x.split('').reverse().join('');
    }
}

然而這樣有一個缺點,就是不能夠精確的表達,輸入為數字的時候,輸出也應該為數字,輸入為字串的時候,輸出也應該為字串,

這時,我們可以使用多載定義多個 reverse 的函式型別:

function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string {
    if (typeof x === 'number') {
        return Number(x.toString().split('').reverse().join(''));
    } else if (typeof x === 'string') {
        return x.split('').reverse().join('');
    }
}

上例中,我們重復定義了多次函式 reverse,前幾次都是函式定義,最后一次是函式實作,在編輯器的代碼提示中,可以正確的看到前兩個提示,

注意:TypeScript 會優先從最前面的函式定義開始匹配,所以多個函式定義如果有包含關系,需要優先把精確的定義寫在前面,

 

七,物件

在JS中,可以任意修改物件屬性,TS中不允許

let obj: object = {x: 'a', y: 'b'}
obj.x = 3    // Property 'x' does not exist on type 'object'.
這是因為,僅宣告了物件obj的型別注解是object,
并沒有為物件內部的具體屬性(屬性名)和型別做限制
let obj: {x: string, y: string} = {x: 'a', y: 'b'}
obj.x = 'c'

還可以使用介面的形式來規范物件,介面會在下一篇隨筆介紹,


八,Symbol

	具有唯一的值
	可以顯式宣告,也可直接創建
let symbol1: Symbol = Symbol()  // 顯示宣告
let symbol2 = Symbol()  // 直接創建

// 驗證:是否是同一個物件
console.log(symbol1 === symbol2)    // fasle

 


九,undefined 和 null

let udf: undefined = undefined
let nu: null = null
一旦宣告了undefined,就不能再被賦值為任何其他的資料型別了:
let undf: undefined = 1 
// Type '1' is not assignable to type 'undefined'.
默認情況下,undefined和null也不能被賦值給任何其他型別:
// 驗證:undefined和null也能被賦值給任何其他型別

let num1: number = undefined    
// Type 'undefined' is not assignable to type 'number'.

let num2: number = null 
// Type 'null' is not assignable to type 'number'.
允許undefined和null被賦值其他型別:
在TS中,undefined和null是任何型別的子型別,所以可以被賦值給其他型別

設定允許被賦值為其他型別

打開tsconfig.js,將strictNullChecks = false(默認true)

nullcheck

在不修改此配置的情況下,實作對undefined和null的賦值,可使用聯合型別
let num3: number | undefined | null = 111

 


十,void

在js中,void運算子可以使任何一個運算式回傳undefined

	void 0 	// 將回傳undefined

在TS中,void型別表示沒有回傳值,沒有回傳值的函式,他的型別就是void型別

// void
let voidFunc = () => {}

 


十一,any

any:如果不指定TS的變數型別,默認為any型別,可以賦值為任何型別
let x
x = 1   // 整型
x = []  // 陣列
x = () => {} // 函式
不建議使用any型別,將失去使用ts的意義

十二,never

never:永遠不會有回傳值的型別

1,函式拋出例外,永遠不會有回傳值,型別為never

// 函式拋出例外,永遠不會有回傳值,型別為never
let error = () => {
    throw new Error('error')
}

 

2,死回圈函式永遠沒有回傳值,型別為never

// 死回圈函式永遠沒有回傳值,型別為never
let endless = () => {
    while(true) {}
}

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/260913.html

標籤:JavaScript

上一篇:TypeScript——01——簡介以及安裝使用

下一篇:vuejs怎樣封裝一個插件(以封裝vue-toast為例擴展)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more