3.7, 其實至今 3.9 beta 已經發布,有興趣的同窗能夠研究一下,這裏列舉幾個經常使用的 3.7 的特性。 大部分自譯,少許借用 google 翻譯(ps: google 翻譯質量還不錯),須要瞭解和使用 typescript 的看官網學習是很是好的,特別是英文文檔寫得很是不錯。html
3.8 譯文已出: Typescript 3.8 經常使用新特性瞭解typescript
?.
的使用// 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
??
運算符let x = foo ?? bar();
複製代碼
這是一種新的表示值foo「存在」時將被使用的方式;可是當它是null或時undefined,去計算
bar()
。函數
一樣,以上代碼等效於如下代碼。post
let x = (foo !== null && foo !== undefined) ?
foo :
bar();
複製代碼
type Json =
| string
| number
| boolean
| null
| JsonObject
| JsonArray;
interface JsonObject {
[property: string]: Json;
}
interface JsonArray extends Array<Json> {}
複製代碼
type Json =
| string
| number
| boolean
| null
| { [property: string]: Json }
| Json[];
複製代碼
咱們沒必要再借用
interface
來組裝一個 Json 數組對象,能夠直接藉由{ }
包裝實現。學習
assert(someValue === 42);
在此示例中,若是someValue不等於42,assert則將拋出AssertionError。
複製代碼
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!");
}
}
複製代碼