【譯】Typescript 3.7 經常使用新特性一覽

寫在最前面

  • 3.7, 其實至今 3.9 beta 已經發布,有興趣的同窗能夠研究一下,這裏列舉幾個經常使用的 3.7 的特性。 大部分自譯,少許借用 google 翻譯(ps: google 翻譯質量還不錯),須要瞭解和使用 typescript 的看官網學習是很是好的,特別是英文文檔寫得很是不錯。html

  • 3.8 譯文已出: Typescript 3.8 經常使用新特性瞭解typescript

可選鏈式運算符

經常使用新特性 1

  • ?. 的使用
// Before
if (foo && foo.bar && foo.bar.baz) {
    // ...
}

// After-ish
if (foo?.bar?.baz) {
    // ...
}
複製代碼

直接看代碼,咱們在使用鏈式調用的時候通常都會檢測鏈式的存在問題,這裏咱們的 ==?== 幫咱們完成了這件事兒。下面看官方的解釋數組

// 使用 ?.
let x = foo?.bar.baz();

// 執行邏輯編譯以下
let x = (foo === null || foo === undefined) ?
    undefined :
    foo.bar.baz();
    
/* 當 foo 不存在或者未定義的時候,直接返回 undefined,這個時候 x = undefined 複製代碼

this is a way of saying that when foo is defined, foo.bar.baz() will be computed; but when foo is null or undefined, stop what we’re doing and just return undefined.」bash

經常使用新特性 2

  • ?? 運算符
let x = foo ?? bar();
複製代碼

這是一種新的表示值foo「存在」時將被使用的方式;可是當它是null或時undefined,去計算 bar()函數

一樣,以上代碼等效於如下代碼。post

let x = (foo !== null && foo !== undefined) ?
    foo :
    bar();
複製代碼

type 的擴展使用

經常使用新特性 3

type Json =
    | string
    | number
    | boolean
    | null
    | JsonObject
    | JsonArray;

interface JsonObject {
    [property: string]: Json;
}

interface JsonArray extends Array<Json> {}
複製代碼
  • ts 3.7 實現
type Json =
    | string
    | number
    | boolean
    | null
    | { [property: string]: Json }
    | Json[];
複製代碼

咱們沒必要再借用 interface 來組裝一個 Json 數組對象,能夠直接藉由{ } 包裝實現。學習

斷言功能的擴展

  • throw若是發生意外狀況,則有一組特定的函數會出錯。它們被稱爲「斷言」功能。例如,Node.js爲此有一個專用功能assert。
assert(someValue === 42);

在此示例中,若是someValue不等於42,assert則將拋出AssertionError。
複製代碼
  • JavaScript中的斷言一般用於防止傳入不正確的類型。例如,
function multiply(x, y) {
    assert(typeof x === "number");
    assert(typeof y === "number");

    return x * y;
}
複製代碼

不太好的是,在TypeScript中,這些檢查永遠沒法正確編碼。對於鬆散類型的代碼,這意味着TypeScript的檢查較少,而對於稍微保守的代碼,則一般迫使用戶使用類型斷言。ui

function yell(str) {
    assert(typeof str === "string");

    return str.toUppercase();
    // Oops! We misspelled 'toUpperCase'.
    // Would be great if TypeScript still caught this!
}
複製代碼
  • 替代方法是改寫代碼,以便語言能夠對其進行分析,但這並不方便。
function yell(str) {
    if (typeof str !== "string") {
        throw new TypeError("str should have been a string.")
    }
    // Error caught!
    return str.toUppercase();
}
複製代碼

解決方案,最終,TypeScript的目標是以最小的破壞性方式鍵入現有的JavaScript結構。所以,TypeScript 3.7引入了一個稱爲「斷言簽名」的新概念,能夠對這些斷言函數進行建模。this

第一種類型的斷言簽名對Node assert函數的工做方式進行建模。它確保在包含範圍的其他部分中,不管檢查什麼條件都必須爲真。google

function assert(condition: any, msg?: string): asserts condition {
    if (!condition) {
        throw new AssertionError(msg)
    }
}
複製代碼

asserts condition表示,condition若是assert返回則傳遞給參數的任何內容都必須爲true (由於不然會引起錯誤)。這意味着對於其他範圍,該條件必須是真實的。舉個例子,使用這個斷言函數意味着咱們確實證明了 yell 的例子。

function yell(str) {
    assert(typeof str === "string");

    return str.toUppercase();
    // ~~~~~~~~~~~
    // error: Property 'toUppercase' does not exist on type 'string'.
    // Did you mean 'toUpperCase'?
}

function assert(condition: any, msg?: string): asserts condition {
    if (!condition) {
        throw new AssertionError(msg)
    }
}
複製代碼

斷言簽名的另外一種類型不檢查條件,而是告訴TypeScript特定的變量或屬性具備不一樣的類型。

function assertIsString(val: any): asserts val is string {
    if (typeof val !== "string") {
        throw new AssertionError("Not a string!");
    }
}
複製代碼

參考

相關文章
相關標籤/搜索