【CSDN 編者按】本文所提到的這些功能,你最希望哪個(gè)能實(shí)現(xiàn)。
原文鏈接:https://www.totaltype.com/type-5-3
作者 | Matt Pocock 翻譯 | ChatGPT
責(zé)編 | 夢(mèng)依丹
出品 | CSDN(ID:CSDNnews)
8月24日,Type 高級(jí)項(xiàng)目經(jīng)理 Daniel Rosenwasser 在官博發(fā)布 Type 5.2 版本,該版本進(jìn)行了多項(xiàng)功能更新,添加了對(duì) ECMA 中即將推出的顯式資源管理功能支持、推出了裝飾器元數(shù)據(jù)(Decorator Metadata),可以讓裝飾器輕松地在其使用的任何類(lèi)上創(chuàng)建和使用元數(shù)據(jù)、命名和匿名元組元素,Tuple 類(lèi)型支持為每個(gè)元素提供可選的標(biāo)簽或名稱(chēng)等。
與此同時(shí),官方團(tuán)隊(duì)還宣布了 Type 5.3 迭代計(jì)劃,該計(jì)劃是用來(lái)規(guī)劃5.3 版本可能包含的功能,本文作者總結(jié)了一些開(kāi)發(fā)者最感興趣的功能。一起看下。
導(dǎo)入屬性(Import Attributes)
Type 5.3 很可能會(huì)新增導(dǎo)入屬性,該功能已經(jīng)達(dá)到 Stage 3 的 TC39 提案。該功能允許開(kāi)發(fā)者導(dǎo)入指定選項(xiàng),例如,你可以指定 JSON 導(dǎo)入類(lèi)型:
importjson from'./foo.json'with{ type: 'json'};它還支持你指定動(dòng)態(tài)導(dǎo)入的類(lèi)型:
import("foo.json", { with: { type: "json"} });還可以使用經(jīng)過(guò)驗(yàn)證的類(lèi)型重新導(dǎo)出一個(gè)模塊:
export{ val } from'./foo.js'with{ type: "JAVA"};
或者使用經(jīng)過(guò)驗(yàn)證的類(lèi)型實(shí)例化 worker:
newWorker("foo.wasm", { type: "module", with: { type: "webassembly"}, });添加該功能的主要目的是處于安全性考慮,防止響應(yīng)服務(wù)器意外提供不同的 MIME 類(lèi)型,從而導(dǎo)致代碼意外執(zhí)行的情況。
支持 throw 異常
throw 表達(dá)式是 Java 里的一種語(yǔ)法,這是一種在不使用語(yǔ)句的情況下拋出異常的一種方式,可以寫(xiě)成:
constid = searchParams.id || thrownewError("id is required");
這種方式在 Java 中并不可用,在 Type 中會(huì)拋出一個(gè)錯(cuò)誤:
constid = searchParams.id || thrownewError("id is required");
Expression expected.
然而,throw 表達(dá)式在 Type 5.3 中不太可能實(shí)現(xiàn)。該提案仍處于第2階段,離添加到 Type 所需的第3階段還有一段距離。
但 Type 迭代計(jì)劃特別增加了對(duì)這個(gè)提案的“支持”。這意味著他們正在積極地開(kāi)展工作,因此它有可能在未來(lái)的 Java/Type 版本中實(shí)現(xiàn)。
隔離聲明(Isolated Declarations)
在一個(gè)包含許多軟件包的單一代碼庫(kù)中,你可能會(huì)遇到相互依賴(lài)的情況。這種情況下,你可能會(huì)得到一個(gè)非常深層次、類(lèi)似于“家族樹(shù)”的結(jié)構(gòu),其中軟件包 A 依賴(lài)于軟件包 B,而軟件包 B 又依賴(lài)于軟件包 C,以此類(lèi)推。
在這種情況下,Type 的檢查可能會(huì)變得非常緩慢。首先必須檢查 D 包,然后是 C 包、B包,最后才是A包。
造成這種情況的原因是 Type 本身需要打印每個(gè)包的聲明文件(.d.ts文件),這也意味著對(duì)它們進(jìn)行類(lèi)型檢查,該過(guò)程很慢。
一種提速方法是讓更快的工具,如 esbuild 或 swc 為每個(gè)包創(chuàng)建聲明文件。但目前這是不可能的。Type 對(duì)于需要添加多少注釋到代碼中并沒(méi)有嚴(yán)格要求。第三方工具無(wú)法根據(jù)推斷生成聲明文件。
引入隔離聲明 - 這是 Type 的一種新、更嚴(yán)格的模式,可以解決這個(gè)問(wèn)題。
可以在 tsconfig.json 添加一個(gè)選項(xiàng):
{ "compilerOptions": { "isolatedDeclarations": true } }一旦啟用,它便會(huì)要求開(kāi)發(fā)者人員嚴(yán)格添加注釋?zhuān)唧w如何要求仍在討論中,并可能隨時(shí)間的變化而改變。作為一個(gè) Demo,導(dǎo)出函數(shù)的返回類(lèi)型注釋很可能是強(qiáng)制性的,以避免 Type 需要推斷它們。
開(kāi)發(fā)者只需要在共享包上啟用 isolatedDeclarations - 你不需要在應(yīng)用程序代碼上啟用它。限制共享包的做法可能是可取的,因?yàn)橥ǔG闆r下,開(kāi)發(fā)者會(huì)希望對(duì)共享包添加更多的注釋。
泛型函數(shù)縮小范圍
在處理通用函數(shù)時(shí),我給出的一個(gè)建議是“不要害怕使用 as”。目前的 Type 在通用函數(shù)內(nèi)部的縮小類(lèi)型方面表現(xiàn)并不理想。
例如:
上述代碼正在嘗試根據(jù) key 從對(duì)象中返回一個(gè)值。如果傳入'foo',將返回一個(gè)字符串。如果傳入'bar',則是返回一個(gè)數(shù)字。
代碼看起來(lái)沒(méi)問(wèn)題,可殊不知 Type 卻報(bào)錯(cuò)了。
原因則是 Type 沒(méi)有將 Example[T] 縮小為正確的 key,一旦對(duì) Example[T] 進(jìn)行縮小操作,就會(huì)導(dǎo)致它被類(lèi)型化為 never,因此報(bào)錯(cuò)。
目前唯一能讓該段程序正常運(yùn)行的方法是將其輸入為“never”。
functionexampleFunc<TextendskeyofExample>( key: T ): Example[T] { if(key === "foo") { return"abc"asnever; } else{ return123asnever; } }感覺(jué)真的很糟。
Type 5.3 可能會(huì)在這里進(jìn)行一些更改。有個(gè) long-open issue 提到了做此更改的動(dòng)機(jī)。
此項(xiàng)更對(duì)我來(lái)說(shuō)是非常高興的事情。這里的泛型錯(cuò)誤推斷于開(kāi)發(fā)者而言,并不容易,如果 Type 在此類(lèi)錯(cuò)誤下變的更聰明一些,那開(kāi)發(fā)者用起泛型會(huì)更加容易。
字符串自動(dòng)補(bǔ)全
Type 里面有個(gè)著名的字符串補(bǔ)全技巧,就是使用 string&{}來(lái)實(shí)現(xiàn)自動(dòng)寬松補(bǔ)全:
typeIconSize = | "small" | "medium" | "large" | (string& {});該注釋看起來(lái)很奇怪,但它存在的原因是為了讓你在傳遞任何值給 IconSize 的同時(shí),還能獲得其他三個(gè)值的自動(dòng)補(bǔ)全。
consticons: IconSize[] = [ "small", "medium", "large", "extra-large", "anything-goes", ];Type 5.3 可能會(huì)推出一個(gè)新功能,使得這個(gè) hack 變得不再必要。開(kāi)發(fā)者將能夠使用字符串作為類(lèi)型,并獲得相同的自動(dòng)補(bǔ)全功能。
typeIconSize = | "small" | "medium" | "large" | string;這將非常受歡迎 - 尤其是因?yàn)?Webstorm 用戶(hù)已經(jīng)擁有了多年。
fetch in @types/node
在 2022 年 2 月 1 日,Node.js 團(tuán)隊(duì)合并了一個(gè)拉取請(qǐng)求,將 Fetch API 添加到 Node.js 中。這意味著 Node.js 將擁有一個(gè)像瀏覽器一樣的 fetch 函數(shù)。但該功能尚未被添加到 @types/node 中,目前該問(wèn)題在 DefinitelyTyped 板塊下引發(fā)了激烈討論。