精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

TypeScript 5.4 正式發布,一起來看看該版本帶來了那些更新

開發 前端
TypeScript 5.4 將是這些已廢棄選項和行為按預期運作的最后一個版本。在預計于 2024 年 6 月發布的 TypeScript 5.5 中,這些選項和行為將變成嚴格的錯誤,使用它們的代碼將需要進行遷移以避免編譯錯誤。

3 月 6 日,TypeScript 發布了 v5.4 版本,該版本帶來了以下更新:

  • 類型縮小會在閉包中保留
  • 引入新的實用程序類型 NoInfer<T>
  • 新增Object.groupBy 和 Map.groupBy
  • 新的模塊解析選項
  • 新的模塊導入檢查機制
  • TypeScript 5.5 即將棄用的功能

類型縮小會在閉包中保留

TypeScript 通過類型縮小來優化代碼,但在閉包中并不總是保留這些縮小后的類型。從TypeScript 5.4開始,當在非提升函數中使用參數或let變量時,類型檢查器會查找最后的賦值點,從而智能地進行類型縮小。然而,如果變量在嵌套函數中被重新分配,即使這種分配不影響其類型,也會使閉包中的類型細化無效。

// TypeScript的類型縮小在閉包中通常不保留  
function exampleFunction(input: string | number) {  
    if (typeof input === "string") {  
        input = parseInt(input); // 假設想要將字符串轉為數字  
    }  
  
    return () => {  
        // 在這里,TypeScript不知道input是string還是number  
        // 因為在閉包創建后,input可能已經被修改  
        console.log(input.toString()); // 錯誤!'input'可能是number,沒有toString方法  
    };  
}

TypeScript 5.4后,當在閉包外部對變量進行最后一次賦值時,類型縮小會在閉包中保留:

function improvedFunction(input: string | number) {  
    let value;  
    if (typeof input === "string") {  
        value = parseInt(input);  
    } else {  
        value = input;  
    }  
  
    return () => {  
        // 在這里,TypeScript知道value是number,因為這是在閉包創建后的最后一次賦值  
        console.log(value.toString()); // 正確!因為現在我們知道value是number  
    };  
}

引入新的實用程序類型 NoInfer

TypeScript的泛型函數能夠根據傳入的參數自動推斷類型。但在某些情況下,這種自動推斷可能不符合預期,導致不合法的函數調用被接受,而合法的調用卻被拒絕。為了處理這種情況,開發者通常需要添加額外的類型參數來約束函數的行為,確保類型安全。但這種做法可能會使代碼看起來更加復雜,特別是當這些額外的類型參數在函數簽名中只使用一次時。

TypeScript 5.4 引入了 NoInfer<T> 實用類型,允許開發者明確告訴編譯器哪些類型不應該被自動推斷。這避免了不合法的函數調用被接受,增強了代碼的類型安全性。

考慮以下函數,它接受一個用戶ID列表和一個可選的默認用戶ID。

function selectUser<U extends string>(userIds: U[], defaultUserId?: U) {  
  // ...  
}  
  
const userIds = ["123", "456", "789"];  
selectUser(userIds, "000"); // 錯誤地被接受,因為"000"不在userIds中

在這個例子中,即使"000"不在userIds數組中,selectUser函數的調用也會被接受,因為TypeScript自動推斷默認用戶ID可以是任何字符串。

TypeScript 5.4 中:

function selectUser<U extends string>(userIds: U[], defaultUserId?: NoInfer<U>) {  
  // ...  
}  
  
const userIds = ["123", "456", "789"];  
selectUser(userIds, "000"); // 正確的錯誤,因為"000"不在userIds中

通過使用 NoInfer<T> 告訴 TypeScript 不要推斷默認用戶ID的類型,從而確保只有當默認用戶ID在userIds數組中時才接受調用。這增強了代碼的類型安全性,避免了潛在的錯誤。

新增 Object.groupBy 和 Map.groupBy

TypeScript 5.4 引入了兩個新方法:Object.groupBy 和 Map.groupBy,它們用于根據特定條件將數組元素分組。

  • Object.groupBy 返回一個對象,其中每個鍵代表一個分組,對應的值是該分組的元素數組。
  • Map.groupBy 返回一個`` Map 對象,實現了相同的功能,但允許使用任何類型的鍵。

使用 Object.groupBy 和 Map.groupBy 可以方便地根據自定義邏輯對數組進行分組,無需手動創建和填充對象或 Map。然而,在使用 Object.groupBy 時,由于對象的屬性名必須是有效的標識符,因此可能無法覆蓋所有情況。此外,這些方法目前僅在 esnext 目標或特定庫設置下可用。

假設有一個學生數組,每個學生都有姓名和成績。我們想要根據成績將學生分為“優秀”和“及格”兩組。

const students: { name: string, score: number }[] = [  
  { name: "Alice", score: 90 },  
  { name: "Bob", score: 75 },  
  { name: "Charlie", score: 85 },  
  // ...其他學生  
];  
  
const groupedStudents: { excellent: any[], passing: any[] } = {  
  excellent: [],  
  passing: []  
};  
  
for (const student of students) {  
  if (student.score >= 80) {  
    groupedStudents.excellent.push(student);  
  } else {  
    groupedStudents.passing.push(student);  
  }  
}

使用 Array.prototype.groupBy 方法,可以更簡潔地實現相同的功能。

const students: { name: string, score: number }[] = [  
  { name: "Alice", score: 90 },  
  { name: "Bob", score: 75 },  
  { name: "Charlie", score: 85 },  
  // ...其他學生  
];  
  
const groupedStudents = students.groupBy(student => {  
  return student.score >= 80 ? "excellent" : "passing";  
});  
  
// 使用時可以直接訪問分組  
console.log(groupedStudents.get("excellent")); // 輸出優秀學生數組  
console.log(groupedStudents.get("passing")); // 輸出及格學生數組

在這個例子中,groupBy 方法根據每個學生的成績將學生數組分為“優秀”和“及格”兩組,并返回一個 Map 對象,其中鍵是分組名稱,值是對應的學生數組。這種方法更加簡潔且易于理解。

新的模塊解析選項

TypeScript 5.4 引入了一個新的模塊解析選項 bundler,它模擬了現代構建工具(如Webpack、Vite 等)確定導入路徑的方式。當與 --module esnext 配合使用時,它允許開發者使用標準的 ECMAScript 導入語法,但禁止了 import ... = require(...) 這種混合語法。

同時,TypeScript 5.4 還增加了一個名為 preserve 的模塊選項,該選項允許開發者在 TypeScript 中使用 require(),并更準確地模擬了構建工具和其他運行時環境的模塊查找行為。當設置 module 為 preserve 時,構建工具會隱式地成為默認的模塊解析策略,同時啟用 esModuleInterop 和 resolveJsonModule。

假設有一個使用 TypeScript 編寫的項目,并且想從一個名為 my-lib 的庫中導入兩個模塊 moduleA 和 moduleB。這個庫提供了 ES 模塊和 CommonJS 模塊兩種格式。在 TypeScript 配置中,你可能這樣設置:

// tsconfig.json  
{  
  "compilerOptions": {  
    "module": "commonjs",  
    "moduleResolution": "node"  
  }  
}

然后代碼中這樣導入:

import * as moduleA from 'my-lib/moduleA';  
import * as moduleB = require('my-lib/moduleB');

在這種情況下,TypeScript 可能會為兩個導入生成相同的路徑,因為它們都使用了 Node.js 的模塊解析策略。

在 TypeScript 5.4 中,如果想更精確地控制導入的路徑,特別是當庫提供了基于導入語法的不同實現時,可以使用 preserve 模塊選項和構建工具模塊解析策略:

// tsconfig.json  
{  
  "compilerOptions": {  
    "module": "preserve",  
    // 隱式設置:  
    // "moduleResolution": "bundler",  
    // "esModuleInterop": true,  
    // "resolveJsonModule": true  
  }  
}

然后,可以這樣編寫代碼:

import * as moduleA from 'my-lib/moduleA'; // 使用 ES 模塊導入  
const moduleB = require('my-lib/moduleB'); // 使用 CommonJS 模塊導入

現在,TypeScript 會根據 my-lib 的 package.json 文件中的 exports 字段來決定使用哪個文件路徑。如果庫為 ES 模塊和 CommonJS 模塊提供了不同的文件,TypeScript 將根據導入的語法(import 或 require)選擇正確的文件。

這意味著開發者可以更精細地控制模塊導入的行為,確保與庫的意圖一致,尤其是在處理那些提供條件導出的庫時。

新的模塊導入檢查機制

TypeScript 5.4 引入了新的模塊導入檢查機制,確保導入的屬性與全局定義的 ImportAttributes 接口相匹配。這種檢查提高了代碼的準確性,因為任何不符合該接口的導入屬性都會導致編譯錯誤。

在早期的 TypeScript 版本中,開發者可以自由地為 import 語句指定任何導入屬性,而不會有嚴格的類型檢查。這可能導致運行時錯誤,因為導入的屬性可能與實際的模塊不匹配。

// 假設存在一個全局的模塊定義,但沒有明確的導入屬性類型  
import * as myModule from 'my-module' with { custom: 'value' };

在上述代碼中,custom 屬性是自由定義的,沒有與任何全局接口或類型進行匹配,這增加了出錯的風險。

在 TypeScript 5.4 及以后的版本中,開發者必須確保導入屬性與全局定義的 ImportAttributes 接口相符。這確保了類型安全,并減少了潛在的運行時錯誤。

// 全局定義的導入屬性接口  
interface ImportAttributes {  
    validProperty: string;  
}  
  
// 在模塊中導入時,必須使用符合 ImportAttributes 接口的屬性  
import * as myModule from 'my-module' with { validProperty: 'someValue' };  
  
// 下面的導入將引發錯誤,因為屬性名稱不匹配  
import * as myModule from 'my-module' with { invalidProperty: 'someValue' };  
// 錯誤:屬性 'invalidProperty' 不存在于類型 'ImportAttributes' 中

在這個新版本中,如果開發者嘗試使用不符合 ImportAttributes 接口的導入屬性,TypeScript 編譯器將拋出錯誤,從而避免了潛在的錯誤。

TypeScript 5.5 即將棄用的功能

TypeScript 5.0 已經廢棄了以下選項和行為:

  • charset
  • target: ES3
  • importsNotUsedAsValues
  • noImplicitUseStrict
  • noStrictGenericChecks
  • keyofStringsOnly
  • suppressExcessPropertyErrors
  • suppressImplicitAnyIndexErrors
  • out
  • preserveValueImports
  • 在項目引用中的prepend
  • 隱式OS特定的newLine

為了在 TypeScript 5.0 及更高版本中繼續使用這些已廢棄的選項和行為,開發人員必須指定一個新的選項 ignoreDeprecations,并將其值設置為 "5.0"。

注意,TypeScript 5.4 將是這些已廢棄選項和行為按預期運作的最后一個版本。在預計于 2024 年 6 月發布的 TypeScript 5.5 中,這些選項和行為將變成嚴格的錯誤,使用它們的代碼將需要進行遷移以避免編譯錯誤。因此,建議開發人員盡早遷移其代碼庫,以避免未來兼容性問題。

責任編輯:姜華 來源: 前端充電寶
相關推薦

2024-12-06 08:00:51

2024-05-24 08:35:00

Angular 18版本更新

2024-03-21 08:21:34

Java 22Java 語言開發工具包

2023-10-20 10:11:00

Nuxt 3.8前端

2022-03-18 08:16:51

微軟Windows 11

2022-06-24 06:32:46

iOS 16Beta 2

2021-09-09 08:47:52

Dependency 安全漏洞工具

2021-07-15 05:26:22

Windows 10操作系統微軟

2021-05-14 05:20:45

Windows10操作系統微軟

2021-10-11 08:21:23

@Valuespringspring框架

2024-04-23 10:29:44

SassCSS前端

2022-02-07 13:34:05

冬奧會黑科技機器人

2010-05-10 17:21:26

Unix操作系統

2024-04-09 10:10:23

GridCSS網格

2022-08-29 15:30:46

TypeScript代碼

2021-06-11 05:19:19

Windows10操作系統微軟

2021-11-17 10:45:58

Chrome 95新特性前端

2023-10-18 10:10:29

Node.js 21前端

2015-11-10 09:57:18

APP流量

2021-02-01 08:16:14

ChromeNode.js
點贊
收藏

51CTO技術棧公眾號

色噜噜狠狠色综合网| 啊v视频在线一区二区三区| 伊人成色综合网| 欧美黄色小说| 日本不卡中文字幕| 草民午夜欧美限制a级福利片| 国产免费一区二区三区最新6| 亚洲天堂导航| 亚洲欧洲国产日韩| 美国av一区二区三区| 99久久婷婷国产一区二区三区| 日韩视频久久| 久久精品在线视频| 一卡二卡三卡四卡| **爰片久久毛片| 欧美色涩在线第一页| 欧美不卡在线播放| 精产国品自在线www| 91亚洲国产成人精品一区二区三| 成人免费网站在线| 91麻豆精品在线| 亚洲黄色大片| 欧美成人精品h版在线观看| aa一级黄色片| 国产伦精品一区二区三区在线播放| 欧美丝袜丝交足nylons图片| 日本中文字幕网址| 任你弄在线视频免费观看| 国产视频一区在线观看| 国产精品久久中文| 日产精品久久久| 欧美日本精品| 日韩午夜激情| 久久精品91久久久久久再现| 在线免费观看a级片| 精品一区二区三区中文字幕在线| 91国在线观看| 欧美极品欧美精品欧美图片| 免费毛片在线看片免费丝瓜视频| 国产成人av一区二区三区不卡| 国产毛片av在线| 不卡一区二区在线| 91日本视频在线| 中文字幕乱码人妻无码久久| 中文久久精品| 欧美精品在线观看91| 日本 欧美 国产| 色综合五月天| xxxxx91麻豆| 小向美奈子av| 91精品91| 欧美情侣性视频| 亚洲一级生活片| 亚洲国产一区二区在线观看| 久久久久99精品久久久久| 午夜国产福利视频| 亚洲啊v在线观看| 欧美成人精品激情在线观看| 久草视频免费在线| 欧美日本一区| 91精品国产亚洲| 人人爽人人爽人人片av| 久久久国产亚洲精品| 国产高清在线不卡| 一级片在线免费播放| 久久精品国产精品亚洲红杏| 亚洲va国产va天堂va久久| 精品国产伦一区二区三| 风间由美性色一区二区三区| 国产精品久久国产三级国电话系列 | 久久精品在这里| 欧美日韩在线一区二区三区| 深夜影院在线观看| 国产亚洲一区二区在线观看| 亚洲精蜜桃久在线| 成人日韩欧美| 亚洲国产wwwccc36天堂| 欧美日韩亚洲一| 欧洲一级精品| 4438x成人网最大色成网站| 亚洲区 欧美区| 亚洲深夜福利在线观看| 综合网中文字幕| 久久久久久久久毛片| 亚洲美洲欧洲综合国产一区| 日本精品一区二区三区在线播放视频 | 久久一区国产| 成人h视频在线观看播放| 国产福利第一页| 91麻豆免费视频| 日韩视频在线播放| 欧洲一区二区三区| 91国产丝袜在线播放| 成人高清在线观看视频| 久久精品国产亚洲blacked| 一本色道久久88综合日韩精品| 日本黄色小说视频| 日韩精品五月天| 国产精品午夜一区二区欲梦| 亚洲av永久无码国产精品久久 | 久久草.com| 日韩av中文| 欧美日韩一区二区三区| 夜夜夜夜夜夜操| 999久久久精品一区二区| 国产亚洲欧美日韩精品| 欧美日韩中文视频| 久久精品国产一区二区| 久久久免费看| av有码在线观看| 欧美日韩精品一区二区在线播放| 蜜臀aⅴ国产精品久久久国产老师| 久久99国产精品久久99大师| 一区二区三区视频免费| 国产精品500部| 青青草97国产精品免费观看| 精品欧美一区二区精品久久| а√天堂在线官网| 欧美性受极品xxxx喷水| 少妇伦子伦精品无吗| 天天插综合网| 国产精品久久一区| 欧美日韩免费做爰大片| 亚洲h精品动漫在线观看| 想看黄色一级片| 精品国产一区二区三区四区 | 黄瓜视频免费观看在线观看www| 一区二区电影免费观看| 亚洲第一在线视频| 久久久久亚洲av成人片| 激情综合亚洲精品| 一区二区不卡在线| yiren22亚洲综合| 国产香蕉一区二区三区在线视频| 日本视频免费在线| 99国产精品久久久久久久久久久| 日韩一级免费看| 国产高清亚洲| 色婷婷综合久久久久| 国产男人搡女人免费视频| 久久久精品天堂| 欧美日韩精品在线一区二区| 国产精品任我爽爆在线播放| 久久久久久久久久国产| 亚洲精品国产suv一区| 亚洲色图欧美偷拍| 国产精品一区二区小说| 欧美电影在线观看免费| 欧美一级黑人aaaaaaa做受| 精品国产亚洲一区二区麻豆| 中文字幕一区二区视频| 亚洲激情在线看| 最新精品国产| 国产伦精品一区二区三毛| 四虎影院观看视频在线观看 | 黄色av免费观看| 亚洲一二三区视频在线观看| 午夜影院免费版| 在线播放日韩| 精品日本一区二区三区| 九色porny自拍视频在线播放| 精品在线欧美视频| 亚洲天堂五月天| 欧美韩日一区二区三区四区| 中文字幕乱码人妻综合二区三区 | 99久re热视频精品98| 欧美一级片网址| 欧美高清自拍一区| 熟妇高潮一区二区高潮| 欧美日韩中文字幕日韩欧美| 国产 欧美 在线| 日韩专区在线视频| 丝袜美腿玉足3d专区一区| 中文成人激情娱乐网| 欧美精品在线观看91| 天天干天天摸天天操| 色久综合一二码| 最新黄色av网址| 美女福利一区二区| 欧美日韩国产一级二级| 99精品久久久久| av亚洲精华国产精华精华| 天天干天天操天天干天天操| 成人污污视频| 欧美一级大胆视频| 拍真实国产伦偷精品| 亚洲第一视频网| 中国一区二区视频| 久久精品亚洲国产奇米99| 日韩欧美国产片| 99热精品久久| 欧美大片在线看| 国产精品爽爽久久久久久| 午夜精品久久久久影视| 特级西西人体高清大胆| 国产在线精品视频| 女女百合国产免费网站| 天堂网av成人| 91麻豆桃色免费看| 九九精品调教| 欧美日韩亚洲视频| 免费视频网站www| 国产精品久久影院| 激情小说欧美色图| 亚洲成人五区| 日韩影院在线观看| 久久精品日产第一区二区三区精品版| 91亚洲天堂| 亚洲国产成人爱av在线播放| 亚洲一区精品在线观看| ...中文天堂在线一区| 第四色在线视频| 麻豆精品新av中文字幕| 久久久久免费看黄a片app| 中文不卡在线| 一级做a爰片久久| 国产99久久精品一区二区300| 91手机在线观看| 精品久久久网| 欧美精品在线观看播放| 国产免费一级视频| 午夜天堂影视香蕉久久| 好吊色视频在线观看| 亚洲日本一区二区| 国产一区二区三区视频播放| 国产三级精品在线| 在线中文字日产幕| 国产综合久久久久久鬼色| 国产免费又粗又猛又爽| 久久精品观看| 黄色国产精品视频| 亚洲精品美女| 欧美,日韩,国产在线| 麻豆视频一区| 国产精品对白刺激久久久| 久久久视频6r| 在线亚洲观看| a级免费在线观看| 综合视频在线| 日本一区视频在线观看免费| 91久久久久久白丝白浆欲热蜜臀| 欧洲亚洲免费在线| 日日av拍夜夜添久久免费| 欧美中文在线字幕| av资源在线| 91国内精品久久| www.成人影院| 亚洲精品久久久久久久久| 呻吟揉丰满对白91乃国产区| 99视频有精品| v8888av| 国产肉丝袜一区二区| 懂色av蜜桃av| 国产精品灌醉下药二区| 黄色一级大片在线免费观看| 中文字幕不卡在线播放| 成人在线电影网站| 播五月开心婷婷综合| 艳妇乳肉亭妇荡乳av| 老司机午夜精品视频在线观看| av观看免费在线| 国产精品激情电影| 欧美 丝袜 自拍 制服 另类| 最新成人av网站| 日韩欧美一区二区三区四区| 欧美黄色大片在线观看| 久久99导航| 欧美日韩一区二区三区视频播放| 日产日韩在线亚洲欧美| 日本高清成人vr专区| 久久免费视频在线观看| 香蕉久久免费电影| 欧美性猛交xxxx偷拍洗澡| 日本欧美黄色片| 久久一综合视频| 日韩一区国产在线观看| 精品少妇3p| 日本福利一区二区三区| 91成人精品| 激情综合在线观看| 精品在线观看免费| 久久国产劲爆∧v内射| 久久影院视频免费| 99久久婷婷国产综合| 香蕉成人伊视频在线观看| 天堂av免费在线观看| av在线网站观看| 亚洲精品国模| caoporen国产精品| 91麻豆精品| 成人女保姆的销魂服务| 精品资源在线| 中文字幕久精品免| 国产精品普通话对白| 久久久久久久高清| 2021中文字幕一区亚洲| 2025国产精品自拍| 影音成人av| 97热精品视频官网| 欧美日韩视频免费看| 91久久在线观看| 欧美日韩xxxx| 17c丨国产丨精品视频| 日本中文字幕不卡| 欧美黑人经典片免费观看| 欧美日本一区二区高清播放视频| 91香蕉视频污版| 精东粉嫩av免费一区二区三区| 巨胸大乳www视频免费观看| 久久久久久久性| 一区二区三区在线观看免费视频| 亚洲不卡av一区二区三区| 国产视频三区四区| 亚洲品质自拍视频| 欧美超碰在线观看| 亚洲黄页网在线观看| 成人在线视频亚洲| 91av视频导航| 欧美1区2区3| 亚洲成色最大综合在线| 青草国产精品| 成人av网站观看| 精品伊人久久久| 国产一线二线三线女| 国模大尺度一区二区三区| 一本在线免费视频| 在线视频你懂得一区| 免费在线高清av| 精品久久久一区| 欧美 变态 另类 人妖| 国产欧美一区二区在线观看| www.av视频在线观看| 欧美变态tickle挠乳网站| 国产露出视频在线观看| 日韩免费中文字幕| 啄木系列成人av电影| 欧美一级视频免费看| 成人一区二区视频| 亚洲一区二区91| 日韩av在线看| 在线播放高清视频www| 国产精品1234| 噜噜噜天天躁狠狠躁夜夜精品| 成人黄色片免费| 国产一区二区毛片| 色婷婷在线影院| 欧美中文字幕一区二区三区亚洲| 亚洲永久精品在线观看| 亚洲国产精品嫩草影院久久| heyzo在线| 麻豆蜜桃91| 老司机午夜免费精品视频| 岛国片在线免费观看| 色噜噜狠狠一区二区三区果冻| eeuss影院在线观看| 91精品成人久久| 国产精品一在线观看| 亚洲免费精品视频| 国产揄拍国内精品对白| 久久一区二区三| 日韩www在线| 精品三区视频| 中国一级黄色录像| 成人性生交大片免费看视频在线| 国产成人亚洲欧洲在线| 凹凸成人精品亚洲精品密奴| 精品日韩在线播放| 精品二区久久| 女~淫辱の触手3d动漫| 色欧美乱欧美15图片| 色综合久久久久综合一本到桃花网| 91久久久在线| 久久不射中文字幕| 在线精品一区二区三区| 日韩欧美在线视频免费观看| 黄色在线播放| 欧洲亚洲女同hd| 水蜜桃久久夜色精品一区| 国产伦精品一区二区三区精品| 91久久香蕉国产日韩欧美9色| 九九热视频在线观看| 成人欧美在线观看| 在线中文字幕第一区| 国产又黄又粗又猛又爽的视频| 欧美日产在线观看| 国模私拍一区二区国模曼安| 亚洲精品中字| 国产91对白在线观看九色| 圆产精品久久久久久久久久久| 俺去啦;欧美日韩| 一个色免费成人影院| 久久黄色片网站| 一区二区三区在线看| 国产精品久久久久久久龚玥菲| 99九九电视剧免费观看| 日韩黄色免费电影| 日本视频www| 久久午夜a级毛片| 中日韩免视频上线全都免费| 欧美成人免费在线|