距離 typescript4.x 版本發布已經有一段時間,目前最新版本為 4.1.3。相較於 3.x 版本,4.x 又支援哪些新特性呢?
4.0 新特性:
可變元組型別
ts4 在 ts3 元組型別的基礎上擴充了三點功能:
1.支援 spread 運算子在元組型別中作為泛型
通過這種方式,開發者可以定義元素型別不確定的陣列或元組,同時編譯器也可以自動推斷出陣列或元組的元素型別。
function tail(arr: readonly [any, ...t]) 函式為例:
在 ts3 中只能通過顯示定義函式過載才能明確 concat 的返回值型別,無奈的是,這種做法無法羅列所有情況並不是一種通用實現。
function concat(arr1: , arr2: [a2]): [a2];
function concat(arr1: [a1], arr2: [a2]): [a1, a2];
function concat(arr1: [a1, b1], arr2: [a2]): [a1, b1, a2];
function concat(arr1: [a1, b1, c1], arr2: [a2]): [a1, b1, c1, a2];
function concat(arr1: [a1, b1, c1, d1], arr2: [a2]): [a1, b1, c1, d1, a2];
function concat(arr1: [a1, b1, c1, d1, e1], arr2: [a2]): [a1, b1, c1, d1, e1, a2];
function concat(arr1: [a1, b1, c1, d1, e1, f1], arr2: [a2]): [a1, b1, c1, d1, e1, f1, a2];
更一般的做法是將 concat 定義為 function concat(arr1: t, arr2: u): array 但是對於編譯器來說,它無法確認 concat 返回值陣列長度和不同元素型別在陣列中的位置。
有了可變元組型別以後,開發者只需簡單幾個語句便可定義出覆蓋所有情況的 concat 型別,並且編譯器可以精確推斷出返回值陣列長度和元素型別在陣列中的位置。
type arr = readonly any;
function concat(arr1: [...t], arr2: [...u]): [...t, ...u] from "preact";
let stuff = <>
hello
/* 編譯輸出為import from "preact";let stuff = h(fragment, null,h("div", null, "hello"));*/
其他新特性--incremental 和 --noemitonerror 同時開啟時,會自動快取前一次編譯的錯誤到 .tsbuildinfo 檔案
允許同時開啟 --incremental 和 --noemit
vscode 支援將條件判斷表示式轉為可選鏈式操作符
vscode 支援對單份 ts **檔案編譯提速
vscode 支援更智慧型的自動匯入
不相容變化ts3 中當設定了 usedefineforclassfields 時,在繼承類的過程中,不允許 getter/setter 屬性和其他屬性的互相覆蓋,ts4 中不再需要設定 usedefineforclassfields,預設禁止互相覆蓋
被 delete 的物件屬性必須是可選的
ts4 前與 ast 節點相關的工廠函式被新的工廠函式所替代,老的完全被廢棄
參考資料announcing typescript 4.0 | typescriptdevblogs.microsoft.com
4.1 新特性:
模版字串型別
es6 後新增了模版字串,使用者可以通過向字串注入變數的方式來構造新的變數,ts4 則可以通過向字串注入型別的方式來構造新的型別。
type world = "world";
type greeting = `hello$`;
// same as// type greeting = "hello world";
模版字串型別可以用於:
1.簡化複雜字串型別的定義
ts4 之後,開發者可以簡化對複雜字串型別的定義,事實上模版字串型別起到了自動組合型別的效果。
// ts3type alignment = "top-left" | "top-center" | "top-right" | "middle-left" | "middle-center" | "middle-right"| "bottom-left" | "bottom-center" | "bottom-right"
// ts4type verticalalignment = "top" | "middle" | "bottom";
type horizontalalignment = "left" | "center" | "right";
type alignment = `$-$`
2.修改動態推導的的字串型別
假設我們想對某個物件的屬性變化進行監聽並且定義了乙個 makewatchedobject 方法來監聽物件屬性。
let person = makewatchedobject(!`);
person.on("agechanged", (newage) => !`);
person.on("locationchanged", (newlocation) => !`);
屬性變化的事件名格式為 $changed,採用模版字串型別定義 makewatchedobject 型別:
type propeventsource = changed`, callback: (v: any) => void): void;
declare function makewatchedobject(obj: t): t & propeventsource;
更進一步,我們可以通過模版字串型別來推導 callback: (v: any) => void 中 v的型別:
type propeventsource = changed`, callback: (v: t[k]) => void): void;
declare function makewatchedobject(obj: t): t & propeventsource;
對映型別屬性重對映
在 ts4 之前的版本中,開發者可通過對映型別從舊型別中建立新型別,如常用 partial 型別:
type partial = `]: () => t[k]
inte***ce props */
2.去除屬性
type removefield = ;*/
3.過濾屬性
type getmethods = ;
inte***ce props ;*/
4.衍生屬性
type doubleprops = 1` | `$2`]: t[p] }
inte***ce props */
遞迴條件型別
ts3 支援通過特定條件判斷來獲取型別:
type isstring = t extends string ? true : false;
type a = isstring; // truetype b = isstring; // false
為了更好的支援型別推斷,ts4 在條件型別的基礎上又增加了可遞迴的條件判斷,常用遞迴條件型別模式為:type a = t extends b ? a: t
比如常見的陣列拍平函式 deepflatten,假設其輸入為任意巢狀的未知型別陣列,對應的輸出為推導的某型別陣列,通過遞迴條件型別表達為:
// 可遞迴條件型別type elementtype =
t extends readonlyarray ? elementtype: t;
function deepflatten(x: t): elementtype ;
let x = foo && somethingelse;
/*ts3 x 型別為 ts4 x 型別為 unknown*/promise.resolve 函式引數不再是可選的
spread 運算子的擴充套件資料型別其對應屬性變為可選
inte***ce person | ts4 返回型別為 */
參考文章announcing typescript 4.1 | typescriptdevblogs.microsoft.com
18 ts中類成員的訪問修飾符
訪問修飾符指的就是可以在類的成員前通過新增關鍵字來設定當前成員的訪問許可權。typescript中主要有三個訪問修飾符 1 public 公開的,預設 任何物件在任何地方都可以進行訪問 2 private 私有的,只能在當前類中進行訪問 3 protected 受保護的,這能在當前類或者子類中進行訪...
ODOO 新API修飾符
api.one one裝飾符自動遍歷記錄集,把self重新定義成當前記錄。注意,返回值是乙個list.web client有可能不支援該裝飾。這時應該用 api.multi修飾函式,函式中可能還需要條用self.ensure one api.multi self就是當前記錄集。api.model 該...
C 學習筆記(4) 屬性與修飾符
屬性與修飾符 屬性是乙個方法或一對方法,但在呼叫它的 看來,它是乙個字段,也就是屬性適合以字段的方式使用方法呼叫的場合。名詞解釋 l 欄位是儲存類要滿足其設計所需要的資料,欄位是與類相關的變數。class pig set c 中有13種修飾符,按功能可分為三部分 訪問修飾符,類修飾符和成員修飾符.訪...