亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.430618.com 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

【CSDN 編者按】本文所提到的這些功能,你最希望哪個能實現。

原文鏈接:https://www.totaltype.com/type-5-3

作者 | Matt Pocock 翻譯 | ChatGPT

責編 | 夢依丹

出品 | CSDN(ID:CSDNnews)

8月24日,Type 高級項目經理 Daniel Rosenwasser 在官博發布 Type 5.2 版本,該版本進行了多項功能更新,添加了對 ECMA 中即將推出的顯式資源管理功能支持、推出了裝飾器元數據(Decorator Metadata),可以讓裝飾器輕松地在其使用的任何類上創建和使用元數據、命名和匿名元組元素,Tuple 類型支持為每個元素提供可選的標簽或名稱等。

與此同時,官方團隊還宣布了 Type 5.3 迭代計劃,該計劃是用來規劃5.3 版本可能包含的功能,本文作者總結了一些開發者最感興趣的功能。一起看下。

導入屬性(Import Attributes)

Type 5.3 很可能會新增導入屬性,該功能已經達到 Stage 3 的 TC39 提案。該功能允許開發者導入指定選項,例如,你可以指定 JSON 導入類型:

importjson from'./foo.json'with{ type: 'json'};

它還支持你指定動態導入的類型:

import("foo.json", { with: { type: "json"} });

還可以使用經過驗證的類型重新導出一個模塊:


export{ val } from'./foo.js'with{ type: "JAVA"};

或者使用經過驗證的類型實例化 worker:

newWorker("foo.wasm", { type: "module", with: { type: "webassembly"}, });

添加該功能的主要目的是處于安全性考慮,防止響應服務器意外提供不同的 MIME 類型,從而導致代碼意外執行的情況。

支持 throw 異常

throw 表達式是 Java 里的一種語法,這是一種在不使用語句的情況下拋出異常的一種方式,可以寫成:


constid = searchParams.id || thrownewError("id is required");

這種方式在 Java 中并不可用,在 Type 中會拋出一個錯誤:


constid = searchParams.id || thrownewError("id is required");

Expression expected.

然而,throw 表達式在 Type 5.3 中不太可能實現。該提案仍處于第2階段,離添加到 Type 所需的第3階段還有一段距離。

但 Type 迭代計劃特別增加了對這個提案的“支持”。這意味著他們正在積極地開展工作,因此它有可能在未來的 Java/Type 版本中實現。

隔離聲明(Isolated Declarations)

在一個包含許多軟件包的單一代碼庫中,你可能會遇到相互依賴的情況。這種情況下,你可能會得到一個非常深層次、類似于“家族樹”的結構,其中軟件包 A 依賴于軟件包 B,而軟件包 B 又依賴于軟件包 C,以此類推。

在這種情況下,Type 的檢查可能會變得非常緩慢。首先必須檢查 D 包,然后是 C 包、B包,最后才是A包。

造成這種情況的原因是 Type 本身需要打印每個包的聲明文件(.d.ts文件),這也意味著對它們進行類型檢查,該過程很慢。

一種提速方法是讓更快的工具,如 esbuild 或 swc 為每個包創建聲明文件。但目前這是不可能的。Type 對于需要添加多少注釋到代碼中并沒有嚴格要求。第三方工具無法根據推斷生成聲明文件。

引入隔離聲明 - 這是 Type 的一種新、更嚴格的模式,可以解決這個問題。

可以在 tsconfig.json 添加一個選項:

{ "compilerOptions": { "isolatedDeclarations": true } }

一旦啟用,它便會要求開發者人員嚴格添加注釋,具體如何要求仍在討論中,并可能隨時間的變化而改變。作為一個 Demo,導出函數的返回類型注釋很可能是強制性的,以避免 Type 需要推斷它們。

開發者只需要在共享包上啟用 isolatedDeclarations - 你不需要在應用程序代碼上啟用它。限制共享包的做法可能是可取的,因為通常情況下,開發者會希望對共享包添加更多的注釋。

泛型函數縮小范圍

在處理通用函數時,我給出的一個建議是“不要害怕使用 as”。目前的 Type 在通用函數內部的縮小類型方面表現并不理想。

例如:

上述代碼正在嘗試根據 key 從對象中返回一個值。如果傳入'foo',將返回一個字符串。如果傳入'bar',則是返回一個數字。

代碼看起來沒問題,可殊不知 Type 卻報錯了。

原因則是 Type 沒有將 Example[T] 縮小為正確的 key,一旦對 Example[T] 進行縮小操作,就會導致它被類型化為 never,因此報錯。

目前唯一能讓該段程序正常運行的方法是將其輸入為“never”。

functionexampleFunc<TextendskeyofExample>( key: T ): Example[T] { if(key === "foo") { return"abc"asnever; } else{ return123asnever; } }

感覺真的很糟。

Type 5.3 可能會在這里進行一些更改。有個 long-open issue 提到了做此更改的動機。

此項更對我來說是非常高興的事情。這里的泛型錯誤推斷于開發者而言,并不容易,如果 Type 在此類錯誤下變的更聰明一些,那開發者用起泛型會更加容易。

字符串自動補全

Type 里面有個著名的字符串補全技巧,就是使用 string&{}來實現自動寬松補全:

typeIconSize = | "small" | "medium" | "large" | (string& {});

該注釋看起來很奇怪,但它存在的原因是為了讓你在傳遞任何值給 IconSize 的同時,還能獲得其他三個值的自動補全。

consticons: IconSize[] = [ "small", "medium", "large", "extra-large", "anything-goes", ];

Type 5.3 可能會推出一個新功能,使得這個 hack 變得不再必要。開發者將能夠使用字符串作為類型,并獲得相同的自動補全功能。

typeIconSize = | "small" | "medium" | "large" | string;

這將非常受歡迎 - 尤其是因為 Webstorm 用戶已經擁有了多年。

fetch in @types/node

在 2022 年 2 月 1 日,Node.js 團隊合并了一個拉取請求,將 Fetch API 添加到 Node.js 中。這意味著 Node.js 將擁有一個像瀏覽器一樣的 fetch 函數。但該功能尚未被添加到 @types/node 中,目前該問題在 DefinitelyTyped 板塊下引發了激烈討論。

分享到:
標簽:TypeScript
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定