国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Typescript基礎知識(類型拓寬、類型縮小)

這篇具有很好參考價值的文章主要介紹了Typescript基礎知識(類型拓寬、類型縮小)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

系列文章目錄

引入一:Typescript基礎引入(基礎類型、元組、枚舉)
引入二:Typescript面向對象引入(接口、類、多態(tài)、重寫、抽象類、訪問修飾符)
第一章:Typescript基礎知識(Typescript介紹、搭建TypeScript環(huán)境、基本數(shù)據(jù)類型)
第二章:Typescript常用類型(任意值any、數(shù)組Array、函數(shù)Function、元組Tuple、類型推論、聯(lián)合類型)
第三章:Typescript基礎知識(類型斷言、類型別名、字符串字面量類型、枚舉、交叉類型)
第四章:Typescript基礎知識(類型拓寬、類型縮?。?br> 第五章:TypeScript進階知識之類(類的定義、類的基本使用、類的構造函數(shù)、類的屬性和方法、訪問修飾符、類的繼承、抽象類)
第六章:TypeScript進階知識之接口(接口定義、接口屬性、可索引類型、接口表示函數(shù)類型、額外的屬性檢查、接口繼承、接口與類型別名的區(qū)別)
第七章:TypeScript進階知識之泛型(泛型的定義、為什么要使用泛型、泛型的使用、泛型變量、多個類型參數(shù)、泛型類、泛型接口、泛型參數(shù)默認類型、泛型約束)



一、類型拓寬

1.1 什么是類型拓寬

所有通過 let 或 var 定義的變量、函數(shù)的形參、對象的非只讀屬性,如果滿足指定了初始值且未添加類型注解的條件,那么它們推斷出來的類型就是指定的初始值字面量類型拓寬后的類型,這就是字面量類型拓寬。(第三章文章有提及過一嘴)

下面我們通過字符串字面量的示例來理解一下字面量類型拓寬:

  let str = 'this is string'; // 類型是 string
  let strFun = (str = 'this is string') => str; // 類型是 (str?: string) => string;
  const specifiedStr = 'this is string'; // 類型是 'this is string'
  let str2 = specifiedStr; // 類型是 'string'
  let strFun2 = (str = specifiedStr) => str; // 類型是 (str?: string) => string;

實際上,除了字面量類型拓寬之外,TypeScript 對某些特定類型值也有類似類型拓寬的設計,比如對 null 和 undefined 的類型進行拓寬,通過 let、var 定義的變量如果滿足未顯式聲明類型注解且被賦予了 null 或 undefined 值,則推斷出這些變量的類型是 any:

  let x = null; // 類型拓寬成 any
  let y = undefined; // 類型拓寬成 any

注意:在嚴格模式下,一些比較老的版本中(2.0)null 和 undefined 并不會被拓寬成“any”。

1.2 如何控制類型拓寬

  • 案例一

我們先來看一個示例,如下代碼所示:

interface Vector {
  x: number;
  y: number;
  z: number;
}

function getComponent(vector: Vector, axis: "x" | "y" | "z") {
  return vector[axis];
}

let x = "x";
let vec = { x: 1, y: 2, z: 3 };
getComponent(vec, x); // Error:類型“string”的參數(shù)不能賦給類型“"x" | "y" | "z"”的參數(shù)。

Typescript基礎知識(類型拓寬、類型縮?。?# ts,typescript,ubuntu,linux
上述代碼中,為什么會出現(xiàn)錯誤呢?通過 TypeScript 的錯誤提示消息,我們知道是因為變量 x 的類型被推斷為 string 類型,而 getComponent 函數(shù)它的第二個參數(shù)有一個更具體的字面量類型。這在實際場合中被拓寬了,所以導致了一個錯誤。

1.2.1 const 控制類型拓寬

如果用 const 而不是 let 聲明一個變量,那么它的類型會更窄。事實上,使用 const 可以幫助我們修復案例一例子中的錯誤:

const x = "x"; // type is "x" 
let vec = { x: 10, y: 20, z: 30 };
getComponent(vec, x); // OK

因為 x 不能重新賦值,所以 TypeScript 可以推斷更窄的類型,就不會在后續(xù)賦值中出現(xiàn)錯誤。
然而,const 對于對象和數(shù)組,仍然會存在問題。

  • 案例二

以下這段代碼在 JavaScript 中是沒有問題的:

const obj = { 
  x: 1,
}; 

obj.x = 6; 
obj.x = '6';

obj.y = 8;
obj.name = 'semlinker';

但是在TypeScrip的環(huán)境中最后三局會出現(xiàn)錯誤:

const obj = { 
  x: 1,
};

obj.x = 6; // OK 


// Type '"6"' is not assignable to type 'number'.
obj.x = '6'; // Error

// Property 'y' does not exist on type '{ x: number; }'.
obj.y = 8; // Error

// Property 'name' does not exist on type '{ x: number; }'.
obj.name = 'semlinker'; // Error

上述代碼中,對于 obj 的類型來說,它可以是 {readonly x:1} 類型,或者是更通用的 {x:number} 類型。當然也可能是 {[key: string]: number} 或 object 類型。TypeScript 的拓寬算法會將對象其內部屬性賦值給 let 關鍵字聲明的變量,進而來推斷其屬性的類型。因此 obj 的類型為 {x:number} 。你可以將 obj.x 賦值給其他 number 類型的變量,但是它還會阻止你添加其他屬性。

1.2.2 提供顯式類型注釋

如果用給let聲明的變量設置顯示的類型注釋,也可以修復案例一例子中的錯誤:

let x: "x" = "x"; // type is "x" 
let vec = { x: 10, y: 20, z: 30 };
getComponent(vec, x); // OK

基于字面量類型拓寬的條件,我們可以通過添加顯示類型注解控制類型拓寬行為。

  const specifiedStr: 'this is string' = 'this is string'; // 類型是 '"this is string"'
  let str2 = specifiedStr; // 即便使用 let 定義,類型是 'this is string'
1.2.3 使用 const 斷言

不要將const 斷言與 let 和 const 混淆,后者在值空間中引入符號。這是一個純粹的類型級構造。讓我們來看看以下變量的不同推斷類型:

// Type is { x: number; y: number; }
const obj1 = { 
  x: 1, 
  y: 2 
}; 

// Type is { x: 1; y: number; }
const obj2 = {
  x: 1 as const,
  y: 2,
}; 

// Type is { readonly x: 1; readonly y: 2; }
const obj3 = {
  x: 1, 
  y: 2 
} as const;

當你在一個值之后使用 const 斷言時,TypeScript 將為它推斷出最窄的類型,沒有拓寬。當然你也可以對數(shù)組使用 const 斷言:

/ Type is number[]
const arr1 = [1, 2, 3]; 

// Type is readonly [1, 2, 3]
const arr2 = [1, 2, 3] as const;

二、類型縮小

在 TypeScript 中,我們可以通過某些操作將變量的類型由一個較為寬泛的集合縮小到相對較小、較明確的集合,這就是類型縮小。

比如,我們可以使用類型守衛(wèi)將函數(shù)參數(shù)的類型從 any 縮小到明確的類型:

  let func = (anything: any) => {
    if (typeof anything === 'string') {
      return anything; // 類型是 string 
    } else if (typeof anything === 'number') {
      return anything; // 類型是 number
    }
    return null;
  };

同樣,我們可以使用類型守衛(wèi)將聯(lián)合類型縮小到明確的子類型,示例如下:

{
  let func = (anything: string | number) => {
    if (typeof anything === 'string') {
      return anything; // 類型是 string 
    } else {
      return anything; // 類型是 number
    }
  };
}

我們也可以通過字面量類型等值判斷(===)或其他控制流語句(包括但不限于 if、三目運算符、switch 分支)將聯(lián)合類型收斂為更具體的類型,如下代碼所示:

{
  type Goods = 'pen' | 'pencil' |'ruler';
  const getPenCost = (item: 'pen') => 2;
  const getPencilCost = (item: 'pencil') => 4;
  const getRulerCost = (item: 'ruler') => 6;
  const getCost = (item: Goods) =>  {
    if (item === 'pen') {
      return getPenCost(item); // item => 'pen'
    } else if (item === 'pencil') {
      return getPencilCost(item); // item => 'pencil'
    } else {
      return getRulerCost(item); // item => 'ruler'
    }
  }
}

在上述 getCost 函數(shù)中,接受的參數(shù)類型是字面量類型的聯(lián)合類型,函數(shù)內包含了 if 語句的 3 個流程分支,其中每個流程分支調用的函數(shù)的參數(shù)都是具體獨立的字面量類型。
那為什么類型由多個字面量組成的變量 item 可以傳值給僅接收單一特定字面量類型的函數(shù) getPenCost、getPencilCost、getRulerCost 呢?這是因為在每個流程分支中,編譯器知道流程分支中的 item 類型是什么。比如 item === ‘pencil’ 的分支,item 的類型就被收縮為“pencil”。
事實上,如果我們將上面的示例去掉中間的流程分支,編譯器也可以推斷出收斂后的類型,如下代碼所示:

  const getCost = (item: Goods) =>  {
    if (item === 'pen') {
      item; // item => 'pen'
    } else {
      item; // => 'pencil' | 'ruler'
    }
  }

一般來說 TypeScript 非常擅長通過條件來判別類型,但在處理一些特殊值時要特別注意 —— 它可能包含你不想要的東西!例如,以下從聯(lián)合類型中排除 null 的方法是錯誤的:

const el = document.getElementById("foo"); // Type is HTMLElement | null
if (typeof el === "object") {
  el; // Type is HTMLElement | null
}

因為在 JavaScript 中 typeof null 的結果是 “object” ,所以你實際上并沒有通過這種檢查排除 null 值。除此之外,false的原始值也會產生類似的問題:

function foo(x?: number | string | null) {
  if (!x) {
    x; // Type is string | number | null | undefined
  }
}

因為空字符串和 0 都屬于 false值,所以在分支中 x 的類型可能是 string 或 number 類型。幫助類型檢查器縮小類型的另一種常見方法是在它們上放置一個明確的 “標簽”:

interface UploadEvent {
  type: "upload";
  filename: string;
  contents: string;
}

interface DownloadEvent {
  type: "download";
  filename: string;
}

type AppEvent = UploadEvent | DownloadEvent;

function handleEvent(e: AppEvent) {
  switch (e.type) {
    case "download":
      e; // Type is DownloadEvent 
      break;
    case "upload":
      e; // Type is UploadEvent 
      break;
  }
}

這種模式也被稱為 ”標簽聯(lián)合“ 或 ”可辨識聯(lián)合“,它在 TypeScript 中的應用范圍非常廣。文章來源地址http://www.zghlxwxcb.cn/news/detail-661408.html

到了這里,關于Typescript基礎知識(類型拓寬、類型縮?。┑奈恼戮徒榻B完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【TypeScript】基礎知識學習筆記

    TypeScript的特點: JavaScript的超集,滿足所有的JS語法 含有面向對象的靜態(tài)類型 起步安裝:1、npm i typescript -g 2、tsc 文件名 一、TS的基本數(shù)據(jù)類型 基本數(shù)據(jù)類型:number、boolean、string、undefined、null、symbol、bigint、void 當中的類型有大小寫的區(qū)分:大寫的類型是給對象使用,小寫

    2024年02月09日
    瀏覽(49)
  • 【03】基礎知識:typescript中的函數(shù)

    函數(shù)聲明法 函數(shù)表達式/匿名函數(shù) 1、typescript 中定義函數(shù)傳參 函數(shù)聲明 函數(shù)表達式/匿名函數(shù) 2、可選參數(shù) 在 es5 中,方法的形參和實參個數(shù)可以不一樣;但是在 ts 中必須一樣,如果不一樣就需要配置可選參數(shù)。 ts 中 通過【 形參?: 數(shù)據(jù)類型 】形式定義可選參數(shù),代表該參數(shù)

    2024年02月13日
    瀏覽(28)
  • ts知識點——基礎積累

    TypeScript是JavaScript的超集。 它對JS進行了擴展,向JS中引入了類型的概念,并添加了許多新的特性。 TS代碼需要通過編譯器編譯為JS,然后再交由JS解析器執(zhí)行。 TS完全兼容JS,換言之,任何的JS代碼都可以直接當成JS使用。 相較于JS而言,TS擁有了靜態(tài)類型,更加嚴格的語法,更

    2024年02月12日
    瀏覽(22)
  • 【01】基礎知識:typescript安裝及使用,開發(fā)工具vscode配置

    【01】基礎知識:typescript安裝及使用,開發(fā)工具vscode配置

    typeScript 是由微軟開發(fā)的一款開源的編程語言。 typeScript 是 javascript 的超級,遵循最新的 es6、es5規(guī)范。 typeScript 擴展了 javaScript 的語法。 typeScript 更像后端 java、C# 這樣的面向對象語言,可以讓 js 開發(fā)大型企業(yè)項目。 全局安裝:$ npm install -g typescript 查看 typescript 版本:$ ts

    2024年02月13日
    瀏覽(35)
  • JavaScript基礎知識09——數(shù)據(jù)類型

    JavaScript基礎知識09——數(shù)據(jù)類型

    哈嘍,大家好啊,這里是雷工筆記,我是雷工。 數(shù)據(jù)類型比較常見,無論是對程序員,還是電氣工程師來說,都再熟悉不過了,這里跟著教程了解一下,主要看跟自己以往在其他PLC,C#,組態(tài)軟件中應用的有啥不同。 在計算機的世界就像黑客帝國中的超級計算機,其中的人、

    2024年02月09日
    瀏覽(19)
  • 數(shù)據(jù)庫基礎知識之數(shù)據(jù)類型

    數(shù)據(jù)庫基礎知識之數(shù)據(jù)類型

    mysql常用數(shù)據(jù)類型 一、數(shù)值類型(整型、浮點型) 1、整型 eg:添加一個表格:點擊表——添加字段——名稱——類型,年齡age是tinyint類型,要在下方勾選無符號,因為年齡都是正數(shù),不存在負數(shù)一說,所以不需要符號。 點擊保存,然后輸入表名,比如t1,就出現(xiàn)了t1 ? ?然后

    2024年02月06日
    瀏覽(20)
  • facebook廣告的基礎知識與類型

    facebook廣告的基礎知識與類型

    Facebook廣告是在Facebook平臺上展示的一種數(shù)字廣告形式,它允許廣告主通過定位特定的受眾群體來推廣他們的產品、服務或品牌。以下是一些關于Facebook廣告的基礎知識: 支持Facebook廣告的卡、556150、532959,點擊獲取 廣告形式: Facebook支持多種廣告形式,包括圖像廣告、視頻廣

    2024年02月02日
    瀏覽(24)
  • MySQL實戰(zhàn)基礎知識入門(13):數(shù)據(jù)類型

    MySQL實戰(zhàn)基礎知識入門(13):數(shù)據(jù)類型

    MySQL實戰(zhàn)基礎知識入門(1):登錄數(shù)據(jù)庫命令行 MySQL實戰(zhàn)基礎知識入門(2):統(tǒng)計一天24小時數(shù)據(jù)默認補0的sql語句 MySQL實戰(zhàn)基礎知識入門(3):近7日銷量合計php后端mysql語句如果當日為空則自動補0的解決方案 MySQL實戰(zhàn)基礎知識入門(4):MySQL高級函數(shù)CASE WHEN END MySQL實戰(zhàn)基礎知識入門

    2024年02月07日
    瀏覽(24)
  • Java基礎知識——類、靜態(tài)、繼承、引用類型使用

    類的定義格式如下: 例如: 例如: 1.3.1 封裝的步驟 1.使用 private 來修飾成員變量。 2.使用 public 修飾getter和setter方法。 1.3.2 封裝的步驟實現(xiàn) private修飾成員變量 public修飾getter和setter方法 1.4.1 構造器的作用 通過調用構造器可以返回一個類的對象,構造器同時負責幫我們把

    2023年04月19日
    瀏覽(24)
  • python基礎知識(二):變量和常用數(shù)據(jù)類型

    python基礎知識(二):變量和常用數(shù)據(jù)類型

    變量是值可以改變的量,其定義方法如下,通過賦值運算符將變量名和變量值連接: 例如: 其中將值\\\"Hello Python world!“通過賦值運算符”=\\\"賦值給變量message。 (1) 變量名只能包含字母、數(shù)字和下劃線。變量名可以字母或下劃線打頭,但不能以數(shù)字打頭,例如,可將變量命名為

    2024年02月06日
    瀏覽(33)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包