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

TypeScript 非空斷言

這篇具有很好參考價值的文章主要介紹了TypeScript 非空斷言。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

TypeScript 非空斷言

發(fā)布于?2020-04-08 15:20:15

17.5K0

舉報

一、非空斷言有啥用

介紹非空斷言前,先來看個示例:

function sayHello(name: string | undefined) {
  let sname: string = name; // Error
}

對于以上代碼,TypeScript 編譯器會提示一下錯誤信息:

Type 'string | undefined' is not assignable to type 'string'.
Type 'undefined' is not assignable to type 'string'.

要解決上述問題,我們可以簡單加個條件判斷:

function sayHello(name: string | undefined) {
  let sname: string;
  if (name) {
    sname = name;
  }
}

使用這種方案,問題是解決了。但有沒有更簡單的方式呢?答案是有的,就是使用 TypeScript 2.0 提供的非空斷言操作符:

function sayHello(name: string | undefined) {
  let sname: string = name!;
}

二、非空斷言操作符簡介

在上下文中當(dāng)類型檢查器無法斷定類型時,一個新的后綴表達式操作符 ! 可以用于斷言操作對象是非 null 和非undefined 類型。具體而言,x! 將從 x 值域中排除 nullundefined

下面我們來介紹一下非空斷言操作符的一些使用場景和注意事項。

2.1 忽略 undefined 和 null 類型
function myFunc(maybeString: string | undefined | null) {
  // Type 'string | null | undefined' is not assignable to type 'string'.
  // Type 'undefined' is not assignable to type 'string'. 
  const onlyString: string = maybeString; // Error
  const ignoreUndefinedAndNull: string = maybeString!; // Ok
}
2.2 調(diào)用函數(shù)時忽略 undefined 類型
type NumGenerator = () => number;

function myFunc(numGenerator: NumGenerator | undefined) {
   // Object is possibly 'undefined'. 
   // Cannot invoke an object which is possibly 'undefined'.
   const num1 = numGenerator(); // Error
   const num2 = numGenerator!(); //OK
}
2.3 使用非空斷言操作符的注意事項

因為 ! 非空斷言操作符會從編譯生成的 JavaScript 代碼中移除,所以在實際使用的過程中,要特別注意。

下面我們來舉兩個簡單的示例:

示例一

const a: number | undefined = undefined;
const b: number = a!;
console.log(b);

以上 TS 代碼會編譯生成以下 ES5 代碼:

"use strict";
const a = undefined;
const b = a;
console.log(b);

雖然在 TS 代碼中,我們使用了非空斷言,使得 const b: number = a!; 語句可以通過 TypeScript 類型檢查器的檢查。但在生成的 ES5 代碼中,! 非空斷言操作符被移除了,所以在瀏覽器中執(zhí)行以上代碼,在控制臺會輸出 undefined。

示例二

type NumGenerator = () => number;

function myFunc(numGenerator: NumGenerator | undefined) {
   const num1 = numGenerator!();
}

// Uncaught TypeError: numGenerator is not a function
myFunc(undefined); // Error

以上 TS 代碼會編譯生成以下 ES5 代碼:

"use strict";
function myFunc(numGenerator) {
  var num1 = numGenerator();
}

// Uncaught TypeError: numGenerator is not a function
myFunc(undefined); // Error

若在瀏覽器中運行以上代碼,在控制臺會輸出以下錯誤信息:

Uncaught TypeError: numGenerator is not a function
    at myFunc (eval at <anonymous> (main-3.js:1239), <anonymous>:3:16)
    at eval (eval at <anonymous> (main-3.js:1239), <anonymous>:6:1)
    at main-3.js:1239

很明顯在運行時,undefined 并不是函數(shù)對象,所以就不能正常調(diào)用。

需要注意的是,非空斷言操作符僅在啟用 strictNullChecks 標(biāo)志的時候才生效。當(dāng)關(guān)閉該標(biāo)志時,編譯器不會檢查 undefined 類型和 null 類型的賦值。

三、非空斷言操作符使用示例

在以下示例中,首先我們使用 TypeScript 類型別名定義了一個 ListNode 類型,用于表示鏈表節(jié)點。該類型包含 datanext 兩個屬性,分別表示當(dāng)前節(jié)點的值和下個節(jié)點。之后,我們還定義了以下兩個函數(shù):

  • addNext(node: ListNode):用于添加下一個節(jié)點;
  • setNextValue(node: ListNode, value: number):用于設(shè)置下一個節(jié)點的值。
type ListNode = { data: number; next?: ListNode; };

function addNext(node: ListNode) {
  if (node.next === undefined) {
    node.next = {data: 0};
  }
}

function setNextValue(node: ListNode, value: number) {
  addNext(node);
  // (property) next?: ListNode | undefined
  // Object is possibly 'undefined'.(2532)
  node.next.data = value; // Error
}

對于以上代碼盡管我們知道在調(diào)用 addNext 方法后,node.next 屬性會被定義,但 TypeScript 在 node.next.data = value 這行代碼中并不能推斷出這些。這時候我們可以使用非空斷言運算符 ! 來斷言 node.next 并不是 undefined,并且使編譯器警告無效:

function setNextValue(node: ListNode, value: number) {
  addNext(node);
  node.next!.data = value;
}

接著我們繼續(xù)看一個示例,假設(shè)你有一個表示 AJAX 請求過程的 UI 狀態(tài)。它要么處于初始狀態(tài)(initial),要么處于掛起狀態(tài)(pending),要么處于完成狀態(tài)(complete),要么處于錯誤狀態(tài)(error)。只有在完成狀態(tài)下才有響應(yīng),否則為 null。

type AjaxState<T> = {
  state: 'initial' | 'pending' | 'complete' | 'error';
  response: T | null;
}

function getAjaxState( ajaxState: AjaxState<number[]> ) {
  if (ajaxState.state === 'complete') {
    // (property) response: number[] | null
    // Object is possibly 'null'.(2531)
    console.log(ajaxState.response.length); // Error
  }
}

雖然我們知道當(dāng)請求的狀態(tài)為 complete 時,響應(yīng)對象不會為 null,但 TypeScript 并無法感知這些,所以我們還需要使用非空斷言 ajaxState.response!.length 來忽略空值并使編譯器警告無效。對于這種場景,其實有一個更好的解決方案,即使用可辨識聯(lián)合:

type AjaxState<T> = 
  { state: 'initial'|'pending'|'error', response: null } |
  { state: 'complete', response: T };

function getAjaxState( ajaxState: AjaxState<number[]> ) {
  if (ajaxState.state === 'complete') {
    console.log(ajaxState.response.length);
  }
}

通過引入可辨識聯(lián)合類型,我們把為 null 和非 null 的響應(yīng)完美的區(qū)分開來,還避免了再次使用非空斷言,此外還大大提高了程序的可讀性。在 TypeScript 實際項目的開發(fā)過程中,除了使用非空斷言(!)之外,讀者還可以使用 TypeScript 3.7 版本中新引入的可選鏈運算符(?.)和空值合并運算符(??)來提高程序的可讀性。文章來源地址http://www.zghlxwxcb.cn/news/detail-645717.html

到了這里,關(guān)于TypeScript 非空斷言的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • TypeScript -類型斷言的簡單理解

    類型斷言 : 是手動的給某個變量 指定類型,從而可以方便操作該類型的屬性和方法。 方式一 : 變量名 as 類型 方式二 :類型 變量名 注意 : 1、類型斷言只是為了方便明確變量的類型,而不是將變量的類型進行改變!??! 2、因此,類型斷言在使用的時候,建議 在我們已

    2024年02月08日
    瀏覽(20)
  • TypeScript基礎(chǔ)知識:類型斷言

    ????????在 TypeScript 中,類型斷言是一種強制將一個值視為特定類型的方式。它允許開發(fā)人員在編譯時指定變量的類型,從而獲得更好的類型檢查和代碼提示。本文將深入探討 TypeScript 中的類型斷言,并提供豐富的示例代碼幫助讀者更好地理解和應(yīng)用這一特性。 ??????

    2024年01月25日
    瀏覽(24)
  • TypeScript 聯(lián)合類型,類型推斷,類型斷言

    取值可以為多種類型中的一個 當(dāng)變量需要調(diào)用某屬性的時候,有不確定當(dāng)前的類型是什么,可以使用類型斷言; 類型斷言的兩種方式: 1,類型 變量名; 2,值 as 類型; 沒有明確的指定類型的情況下推斷出一個類型;

    2024年02月15日
    瀏覽(28)
  • 【TypeScript】類型斷言-類型的聲明和轉(zhuǎn)換(五)

    【TypeScript】類型斷言-類型的聲明和轉(zhuǎn)換(五)

    一、簡介 TypeScript 斷言是指在編寫代碼時,開發(fā)者能夠告訴編譯器某個值的具體類型,從而可以在編譯階段強制類型檢查。 這其實在某些強類型語言中,類似于強制類型轉(zhuǎn)換的操作。 類型斷言有兩種形式實現(xiàn): 尖括號語法 as語法 二、斷言形式 2.1 尖括號語法 尖括號語法:開

    2024年02月13日
    瀏覽(23)
  • 服務(wù)端使用ASP.NET Core SignalR與Vue3(TypeScript與JavaScript)前端建立通信(以進度條為例)

    服務(wù)端使用ASP.NET Core SignalR與Vue3(TypeScript與JavaScript)前端建立通信(以進度條為例)

    1. ASP.NET Core ? ? ? ? ? ASP.NET Core 是一個跨平臺、高性能及開源的框架,用于生成基于云且連接互聯(lián)網(wǎng)的新式應(yīng)用程式。 官方文檔:ASP.NET documentation | Microsoft Learn ?2.? ASP.NET Core SignalR ? ? ? ? ASP.NET Core SignalR 是開源庫,用于服務(wù)端與客戶端建立實時通信,可以自動管理連接

    2024年02月06日
    瀏覽(21)
  • TypeScript 在前端開發(fā)中的應(yīng)用實踐

    TypeScript 已經(jīng)成為前端開發(fā)領(lǐng)域越來越多開發(fā)者的首選工具。它是一種靜態(tài)類型的超集,由 Microsoft 推出,為開發(fā)者提供了強大的靜態(tài)類型檢查、面向?qū)ο缶幊毯湍K化開發(fā)的特性,解決了 JavaScript 的動態(tài)類型特性帶來的一些問題。 在本篇博文中,我們將深入探討 TypeScript 在

    2024年02月15日
    瀏覽(25)
  • 前端2023最全面試題(javaScript、typeScript、vue2、vue3、html、css、uniapp、webpack、vite、react)

    答案:JavaScript中的閉包是一種函數(shù),它有權(quán)訪問其詞法環(huán)境的變量和其它函數(shù)。這意味著,即使其包含它的函數(shù)已經(jīng)執(zhí)行完畢,其詞法環(huán)境仍然存在,因此可以訪問其作用域內(nèi)的變量。 答案:回調(diào)函數(shù)是在某個特定事件之后執(zhí)行的函數(shù)。在JavaScript中,通常使用回調(diào)函數(shù)來處

    2024年02月06日
    瀏覽(29)
  • TypeScript在前端開發(fā)中的重要性

    近年來, TypeScript 在前端開發(fā)中的重要性逐漸得到認(rèn)可。作為一種靜態(tài)類型的 JavaScript 的超集, TypeScript 通過引入靜態(tài)類型、接口、類等特性,為前端開發(fā)帶來了許多優(yōu)勢。本文將探討 TypeScript 在前端開發(fā)中的重要性,并通過代碼論證其價值。 首先, TypeScript 通過引入靜態(tài)類

    2024年02月11日
    瀏覽(26)
  • 【TypeScript】TS類型斷言-類型的聲明和轉(zhuǎn)換(五)

    【TypeScript】TS類型斷言-類型的聲明和轉(zhuǎn)換(五)

    ??個人主頁: 不叫貓先生 ???♂?作者簡介:前端領(lǐng)域新星創(chuàng)作者、華為云享專家、阿里云專家博主,專注于前端各領(lǐng)域技術(shù),共同學(xué)習(xí)共同進步,一起加油呀! ??系列專欄:vue3從入門到精通、TypeScript從入門到實踐 ??個人簽名:不破不立 ??資料領(lǐng)取:前端進階資料以

    2024年02月22日
    瀏覽(23)
  • TypeScript 學(xué)習(xí)筆記(一):基本類型、交叉類型、聯(lián)合類型、類型斷言

    TypeScript 學(xué)習(xí)筆記(一):基本類型、交叉類型、聯(lián)合類型、類型斷言

    TS中實現(xiàn)對象屬性必選、對象屬性在開發(fā)過程中十分常見,前端在傳參數(shù)時,有些參數(shù)比必傳,有些是選傳,我們可以定一個多個對象來實現(xiàn)傳參,但是這讓代碼變得冗余。我們可以通過TS定義數(shù)據(jù)類型來實現(xiàn)。 TypeScript中文網(wǎng) 1. 數(shù)組 2. 布爾 3. 數(shù)值 當(dāng)我們給num賦值為123但沒有

    2024年02月15日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包